关于endian的故事,big-endian和little-endian

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。

目前在各种体系的计算机中,通常采用big-endian和little-endian两种字节存储机制描述在多字节数中各个字节的存储顺序。

据Jargon File记载,endian这个词来源于Jonathan Swift在1726年写的讽刺小说 "Gulliver's Travels"(《格利佛游记》)。该小说在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从大的一端剥开的人Swift就称作Big-Endians,而支持从小的一端剥开的人就称作Little-Endians......(后缀ian表明的就是支持某种观点的人)。
1980年,Danny Cohen在其著名的论文"On Holy Wars and a Plea for Peace"中为了平息一场关于在消息中 字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians,支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。
三、常见的Endian

Big-endian

按照最高位 字节(包含最高位,即MSB,的 字节)至最低位字节(包含最低位,即LSB,的字节)的顺序,存放在连续的地址中。
采用这种机制的处理器有IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。
例如:双 字节数0x1234以big-endian的方式存在起始地址0x00000000中
数据<--地址
| 0x12 |<-- 0x00000000
| 0x34 |<-- 0x00000001

Little-endian

按照最低位 字节(包含LSB的字节)至最高位字节(包含MSB的字节)的顺序,存放在连续的地址中。
采用这种机制的处理器有 PDP-11、VAX、Intel系列微处理器和一些网络通信设备。
例如:双字节数0x1234以 little-endian的方式存在起始地址0x00000000中
数据<--地址
| 0x34 |<-- 0x00000000
| 0x12 |<-- 0x00000001

Middle-endian

除了big-endian和 little-endian之外的 多字节存储顺序就是middle-endian。
比如以4个 字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的就是middle-endian。
这种存储顺序偶尔会在一些 小型机体系中的十进制数的压缩格式中出现。

程序开发中的应用

byte[] bytes = { 0, 0, 0, 25 };
// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25
在此示例中,调用 BitConverter 类的 GetBytes(Int32) 方法以将 int 转换为字节数组。

你可能感兴趣的:(关于endian的故事,big-endian和little-endian)