题
我试图此
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] ...
解决方案
由于你正在运行的处理器是小端。字节顺序,多字节基本型,被交换。在大端机器,你期望的那样。
其他提示
字节序明显的答案为戈兹贝达指出。
但是,对于那些谁也不清楚是什么意思,它也是重要的是理解,在示例中显示字节顺序是一样的,在原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;
如果你希望你的应用程序可以移植或团队内部开发的,你可能不想遵循这一逻辑,因为它会导致很难赶上错误和延长的发展。