这是指数据在存储空间中方置的时候,怎么样放置字节的问题。这个是和所用PC的架构和操作系统有关的。
常见的架构和操作系统以及他们都是用什么呢?
一般来说对于CPU的架构中,intel x86使用Little-endian,而motorola系列的CPU 特指PowerPC系列使用的是Big-endian. ARM则是两者都支持,但是默认是little-endian,linux平台也是这样的。MAC则是用BIG-endian 。
c/c++ 是little-endian ,java是big-endian,所以进行这两种之间数据传送的时候要进行转换。
所谓的little-endian and big-endian指的是什么?
首先一个数区分最高有效字节MSB,最低有效字节LSB我们所看到的,例如0x12345678,前面的0x12.. 指MSB,后面的0x..78指LSB
big endian是指低地址存放MSB,little endian则是低地址存放LSB。或者简单说, big-endian指高位放低地址上,而little-endian指低位放低地址上。
big-endian是指big end first, 也就是先放大数,或者先放高进制的数。
if the base address is 0x1000, the data is placed as
address little-endian big-endian
0x1000 78h 12h
0x1001 56h 34h
0x1002 34h 56h
0x1003 12h 78h
注意这里最小的单元是字节,所以在big-endian里看起来就和打印的顺序一样的,但即使在little-endian 里,也不是完全的反过来,而是按照字节反过来,所以不会出现某个字节变成21h这样的数字的。
同时这里的顺序指的是在一个word或Dword中的排序问题,一个word是16位的,DWORD 32-bit。对于多于一个DWORD的多字节数据,仍然是按照先后顺序来放的。比如一个64位的数据0x1122334455667788,在little-endian中的顺序是0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55。(待查证)
历史来源是什么?
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱。大致原因是传统上是按照大头敲开的,但是某个国王的祖父按照传统打开鸡蛋的时候伤了手指,所以国王就下令所有人都要用小头敲开鸡蛋,但是有人不同意,就发生了叛乱。
优点和缺点是什么?
little-endian里,offset 0 的地方放的是byte0,这样在放数的时候比较清楚,对于汇编语言来说比较容易取数。
big-endian和我们的打印顺序一致,方便进行二进制和10进制的转换;同时最高位在最前面,所以可以很容易判断这个数的正负。
对于一些特殊的应用,就要注意他们本身是什么格式的。如bmp 文件就是little-endian的
Common file formats and their endian order are as follows:
reference:
http://en.wikipedia.org/wiki/Endianness
http://www.cppblog.com/future0906/archive/2005/11/19/1193.html