Big&Little Endian 高&低字节序

  由于CPU的两大对立阵营的对抗导致了所谓的字节顺序问题。PowerPC(Moto&IBM) VS X86 = Big Vs. Little,两种不同处理多字节数据的方式在多机通讯和网络编程时会给我们带来意外的“惊喜”。开了书和网上的帖子,其实挺简单,一言以蔽之就是 Big-endian最先读写最高的字节,Little-endian反其道而行,低字节优先。 如下例示:
Big Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

举个例子,从内存地址0x0000开始有以下数据
0x0000     0x12
0x0001     0x34
0x0002     0xab
0x0003     0xcd
如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出
结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412.
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd

0x0001     0x23              0xab

0x0002     0xab               0x34

0x0003     0xcd               0x12

intel是高字节序

solaris(Sun系统)是高字节序

 

高字节序即高位 (所谓高位指的是2(n-1) ~2(n-8)的值) 存低地址        

低字节序即低位 (所谓低位指的是 27~20的值) 存低地址

 

 

#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;


void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)

你可能感兴趣的:(编程,网络,Solaris,sun,通讯,X86)