大端(Big Endian)与小端(Little Endian)简介
Endianness 的问题实质就是关于计算机如何存储大的数值的问题。
我们知道一个基本存储单元可以保存一个字节,每个存储单元对应一个地址。对于大于十
进制 255(16 进制 0xff)的整数,需要多个存储单元。例如,4660 对应于 0x1234,需要
两个字节。不同的计算机系统使用不同的方法保存这两个字节。在我们常用的 PC 机中,低
位的字节 0x34 保存在低地址的存储单元,高位的字节 0x12 保存在高地址的存储单元;而
在 Sun 工作站中,情况恰恰相反,0x34 位于高地址的存储单元,0x12 位于低地址的存储
单元。前一种就被称为 Little Endian,后一种就是 Big Endian。
如何记住这两种存储模式?其实很简单。首先记住我们所说的存储单元的地址总是由低到
高排列。对于多字节的数值,如果先见到的是低位的字节,则系统就是 Little Endian
的,Little 就是"小,少"的意思,也就对应"低"。相反就是 Big Endian,这里 Big "大"对
应"高"。
为了加深对 Endianness 的理解,让我们来看下面的 C 程序例子:
char a = 1;
charb = 2;
地址偏移量 内存映像
short c = 255; /* 0x00ff */ 0x0000: 01 02FF 00
longd = 0x44332211; 0x0004: 11 22 33 44
在右侧我们可以见到在基于 Intel 80x86 的系统上的内存映像,显然我们可以马上判定这一
系统是 Little Endian 的。对于 16 位的整形数(short)c,我们先见到其低位的 0xff,下一个才
是 0x00。同样对于 32 位长整形数(long)d,在最低的地址 0x0004 存的是最低位字节
0x11。如果是在 Big Endian 的计算机中,则地址偏移量从 0x0000 到 0x0007 的整个内存映
像将为:01 02 00 FF 44 33 22 11。
用文字说明可能比较抽象,下面用图像加以说明。比如数字 0x12345678 在两种不同字节
序 CPU 中的存储顺序如下所示:
Big Endian