我试图此

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

的输出是这样的:结果 89个结果 0点击 0点击 0结果

其中相当教导我的大肚子因为我认为数量会等保存在内存

0x00000059所以怎么来C [0]是89?我认为这被认为是在C [3] ...

有帮助吗?

解决方案

由于你正在运行的处理器是小端。字节顺序,多字节基本型,被交换。在大端机器,你期望的那样。

其他提示

这是因为你在小尾数 CPU。另见字节序这里和的中。

字节序明显的答案为戈兹贝达指出。

但是,对于那些谁也不清楚是什么意思,它也是重要的是理解,在示例中显示字节顺序是一样的,在原INT的顺序。 memcpy的不改变的字节顺序,无论edian类型的平台的

由于字节顺序是任意的设计决定。一旦在寄存器中,没有字节顺序 1

当我们处理更小的单位像字节字节顺序出现。这是一个基本任意决定CPU设计得做出:大端或小端

这是有用的,以简化有关情况,并意识到它主要是被字节下令外设的连接。是的,它可以通过字节寻址发现你已经证明,但一般标值加载和存储为单位,到寄存器,在这种情况下字节顺序不会改变任何东西。最显著位在“左”,至少,我们平时写号的方式。这就是根据语言的标准时,为什么<<>>运营商总是产生于大端VS小端机器同样的结果。

但是,为了读取和写入数据流的外围设备,则被迫选择一个字节顺序。这是因为外设有根本的字节流设备。是否最低地址有最显著位或最低?它这两种方式并用的营地被均匀分成,而

由于内存本身是字节寻址,它肯定可以不外围导出不同的行为,但是这通常是像你这样不无故意偷看里面发生。

想象不具有字节,只有32位字的CPU,地址为0,1,2,C编译器使得炭,int和长所有32位的对象。 (这是由CX9允许的。)哇,没有字节序的问题!这既是!但是..当我们挂钩会发生什么我们的第一周??


1 <子>好,86具有寄存器,别名较小寄存器,但是另一回事。

不同的机器可以有不同的字节顺序,但看看这个代码,想想会发生什么,这取决于字节如何laied了:

long x = 89;
short *p = (short*)&x;
short y = *p;

如果你希望你的应用程序可以移植或团队内部开发的,你可能不想遵循这一逻辑,因为它会导致很难赶上错误和延长的发展。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top