[转]浅谈字节序(Endianness)

发布时间:2012-11-15 19:40
分类名称:windows


 From: http://4ever-memory.com/2010/03/05/introduction-to-endianness/

假期里面在家里忙尹老师的激光项目,阅读文件格式文档的时候看到关于字节序(Byte Order)的要求:

For values which span more than a single byte, the multiple byte ordering followed is that of the Big Endian / Motorola standard. The most significant byte will occur first, the least significant byte last

想起以前在汇编语言和数字逻辑的时候也有接触到一些这个概念,已经有点模糊了,搞不清楚哪个是低位在前哪个是高位在前。后来在WikiGoogle的帮助下也算摸清楚了一些Endianness的概念。

一、字节序的起源

在计算机中,字节序(Endianness是数据中单独的可取地址的亚型(wordsbytesbits)在外部存储器中存储的顺序。通常在提到四字(ddword)、双字(dword)和字(word)的时候需要考虑其实际的字节顺序,为了简便起见它的英文也常常表示为Byte Order

Endianness这个词源自1726Jonathan Swift的名著:Gulliver's Travels(格列佛游记),在书中有一个故事,大意是指Lilliput(小人国)的领导下了一道指令,规定其人民在剥水煮蛋时必须从little-end(小的那一端)开始。这个规定惹恼了一群觉得应该要从big-end(大的那一刻)开始剥的人。事情发展到后来,竟然演变成一场纷战。支持小的那端的人被称为little-endian,反之则被称为big-endian(在英语中后缀"-ian"表示"xx"的意思)。1980Danny Cohen在他的论文"On Holy Wars and a Plea for Peace"中第一次使用了Big-Little-这两个术语,最终它们成为了计算机通过网络与其他计算机连接时所要考虑的极其重要的一个问题。

二、字节序的种类和其表示

那么为什么要引入字节序呢。我们都知道,计算机存储中最小的单位是位(bit),而8bit构成一个字节(byte)。在一个32位的CPU中,字长为32bit,也就是4byte,数据要想存放在内存中供CPU读取和写入,就需要拥有一定的存放顺序。这样不同的CPU可接受的字节序有可能不同,那么在设计硬件和软件时数据的存放问题也需要分开考虑。

数据都有所谓的"有效位(Significant Bit",顾名思义它表示了"数据存放有效的位置",而字节序的分类就是依赖于有效位来进行划分的。在一个字节当中,数据的有效位的顺序已经得到了大多数硬件生产商的共识,那就是最高有效位优先(Most Significant Bit First),例如我们用8位二进制数来表示十进制数12301111011,其第一位的0就是最高有效位,而最后一位的1就是最低有效位,在一个字节当中,几乎当前所有的硬件都采用了这种直观的字节序。

然而情况在离开了单字节时就有所不同了。不同的硬件产商对于数据占据多个字节时拥有怎样的字节序有着不同的理解,具体说来分为以下三类: