Big Endian 和 Little Endian
字节序
谈到字节序的问题,必然牵涉到两大 CPU 派系。即 Motorola 的 PowerPC 系列 CPU 和 Intel 的 x86 系列 CPU。PowerPC 系列采用 Big Endian 方式存储数据,而 x86 系列则采用 Little Endian 方式存储数据。
那么究竟什么是 Big Endian,什么又是 Little Endian 呢?
Big Endian:指低地址存放最高有效字节(MSB),即最高字节在地址最低位,最低字节在地址最高位,依次排列。
Little Endian:低地址存放最低有效字节(LSB);即最低字节在最低位,最高字节在最高位,反序排列。
用文字说明可能比较抽象,下面用图像加以说明。
比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:
Big Endian
低地址----------->高地址
| 12 | 34 | 56 | 78 |
Little Endian
低地址--->高地址
| 78 | 56 | 34 | 12 |
从上面两图可以看出,采用 Big Endian 方式存储数据是符合我们人类的思维习惯的。而 Little Endian ,...,见鬼去吧!
为什么要注意字节序的问题呢?如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?
这里不妨用两种语言举例。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而Java编写的程序则唯一采用 Big Endian 方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的Java程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了Java程序,由于Java采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为0x78563412。这样,就变成另外一个数字了!这,就是后果。因此,在你的C程序传给Java程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用 Big Endian 的方式来传输数据的。所以有时我们也会把 Big Endian 方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
Big Endian 和 Little Endian名词的由来
这两个术语来自于 Jonathan Swift 的《格利佛游记》其中交战的两个派别无法就应该从哪一端打开一个半熟的鸡蛋达成一致。:)
我们一般将Endian翻译成“字节序”,将Big Endian和Little Endian称作“大尾”和“小尾”。