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]中...
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]中...
因为您正在运行的处理器是小端。多字节基本类型的字节顺序会被交换。在大端机器上,它将如您所期望的那样。
正如Goz所指出的那样,字节序是明显的答案。
但对于那些不清楚其含义的人来说,重要的是要理解在示例中显示的字节顺序与原始int中的顺序相同。无论平台的字节序类型如何,memcpy都不会改变字节顺序。
当我们处理更小的单元(例如字节)时,字节顺序就会出现。这是CPU设计者可以做出的基本上是任意的决定:大端或小端。
简化情况并意识到它主要是与外围设备的连接有关,字节排序才有意义。是的,它可以通过字节寻址发现,就像您证明的那样,但通常标量值被加载和存储为单位,进入寄存器,在这种情况下,字节顺序不会改变任何东西。最重要的位在“左侧”,至少是我们通常书写数字的方式。这就是为什么在遵循语言标准使用时,<<和>>运算符在大端和小端机器上总是产生完全相同的结果。
但是,为了读取和写入数据流到外围设备,您必须选择字节顺序。这是因为外围设备本质上是字节流设备。最低地址具有最重要的位还是最不重要的位?两种方法都可以实现,而且阵营曾经相当均衡。
由于内存本身是按字节寻址的,因此在没有外围设备的情况下可能会导致不同的行为,但是这通常不会发生,除非像您所做的那样有一个故意的窥视。
想象一下一个没有字节只有32位字的CPU,被寻址为0、1、2。C编译器使char、int和long都成为32位对象。(这是由Cx9允许的。)哇,没有字节顺序问题!它是两者!但是……当我们连接第一个外围设备时会发生什么?
1.好吧,x86有别名较小寄存器的寄存器,但那是另一回事。
long x = 89;
short *p = (short*)&x;
short y = *p;