big and little endian

概括:

big endian: 高byte低地址。0x123456 12 34 56 (低地址--高地址)

little endian:低byte 低地址。 0x123456 56 34 12 (低地址--高地址)

 

谈到字节排序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列
CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little
endian方式存储数据。ARM同时支持 big和little,实际应用中通常使用little
endian。那么究竟什么是big endian,什么又是little endian呢?

其实big endian是指低地址存放最高有效字节(MSB),而little
endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian
一个Word中的高位的Byte放在内存中这个Word区域的低地址处

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

Little Endian
一个Word中的低位的Byte放在内存中这个Word区域的低地址处

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

从上面两图可以看出,采用big
endian方式存储数据是符合我们人类的思维习惯的。必须注意的是:一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个
Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来
处理字节。
一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.简单的说,little
endian把低位存放到高位,而big endian把低位存放到低位.
现在主流的CPU,intel系列的是采用的little
endian的格式存放数据,而motorola系列的CPU采用的是big endian.
以下是判断字节存储顺序的可移植的C语言代码:
/*可移植的用于判断存储格式是
little endian还是big ednian的C代码*/
#include < stdio.h >
union
{
long Long;
char Char[ sizeof ( long )];
} u;

int main()
{
u.Long = 1 ;
if (u.Char[ 0 ] == 1 )
{
printf( " Little Endian!\n " );
}
else if (u.Char[ sizeof ( long ) - 1 ] == 1 )
{
printf( " Big Endian!\n " );
}
else
{
printf( " Unknown Addressing!\n " );
}

printf( " Now, Let's look at every byte in the memory!\n " );
for ( int i = 0 ; i < sizeof ( long ); ++ i)
{
printf( " [%x] = %x\n " , & u.Char[i], u.Char[i]);
}
return 0 ;
}

你可能感兴趣的:(big and little endian)