[zt] Big-Endian VS Little-Endian —— 从大头开始还是小头开始

http://hi.baidu.com/zotin/blog/item/17cb72f05ae600a6a50f52a2.html

 

剥鸡蛋从哪头开始,有人注意过这个问题吗?我认真地回想了一下,发现我多数情况下会从大头开始,但也有从小头开始的时候。如果为这样的一个问题发生争执,甚至形成“派系”,这是不是很好笑。在《格利佛游记》就有这样两个好笑的派系。这两个派系诞生在小人国,从大头开始剥的人叫“Big-Endian”,从小头开始吃的人叫“Little-Endian”。
人小鸡蛋相对自然就大了,怎么吃也就是大事了,争执一下情有可原。在我们看来,为这种琐碎争吵实在有点可笑,然而在另一件琐碎的事上,却发生了类似的争吵。这就是字节序问题。对计算机底层知识了解一点的人都知道,1个字有2个字节,双字有4个字节。但很多人都不怎么关心这2个或者4个字节是怎么存储的。比如一个字0x1234,0x12和0x34这两个字节存储的地址哪一个大?对这个问题的第一反应多数恐怕是怎么存放都没关系。的确这是一个小问题,但却曾引起了不小的争吵。直到有人写了一篇"On Holy Wars and a Plea for Peace"才平息了这种争吵。作者在最后提出的观点是在某些情况下,统一一种方式是必要的,但不必为这种问题做过多的争论,任选一种就可以了。他将认为字节序应该从大数开始人称为Big-Endian,而小数开始的人称为Little-Endian。Endian被翻译成字节序,而Big-Endian和Little-Endian就翻译成大端序和小端序。这个叫法的调侃味道荡然无存了。因为中国人看过《格利佛游记》人很少,所以这也实在是没办法的事。
以前我老是记不清楚Big-Endian和Little-Endian,看了这个“典故”以后到一下记住了,地址当然是从低的开始,低位的数字较小,所以从大头开始的Big-Endian的低字节当然存储的是高位,相应的从小头开始的Little-Endian低字节存储的是低位。可见,多知道一点“典故”不但有趣,而且有时候还有用。

 

http://hi.baidu.com/zotin/blog/item/3d35aa64d0bd1df9f63654b0.html

 

如果是剥水煮鸡蛋,通常是从大头开始的。因为大头有个气室,比较容易打破。有趣的是,对应的一般人也会觉得Big-Endian更自然一些。比如0x1234 = 0x1200 + 0x34,0x1200比较大,放在开始的地址(较低的地址),那么用2进制编辑软件打开的时候,看到的就是

这个确实比较自然,相对的,Little-Endian的看到的就会是34 12,感觉比较古怪了。而且如果这儿有一大堆数字。你想从中找到某个已知的多字节整数,那你首先要在把几个字节交换一下位置再找,这个就真的有点麻烦了。所以在网络上传输2进制文件的时候,用的都是Big-Endian。
那么为什么有的系统还是会用Little-Endian呢?其实很简单,就是当时在设计系统的时候,设计者觉得Little-Endian更自然。这就奇怪了,刚才不是说Big-Endian更自然吗?会有两个“更自然”到不是因为我喜欢和稀泥(虽然我到真的有点喜欢和稀泥),而是站的角度不一样。Little-Endian的自然表现在:高位的地址较高,低位的地址较低。如果这仅仅只是字面上的自然到也没什么说服力。看具体的:
int integers[] = {1};
int endian = (*(char*)integers)&1;
这儿的endian的值是多少?x&1是取x的最低位,所以自然的会想到结果是1,如果是Little-Endian,是对的。但如果是Big-Endian,不好意思,是0。因为取的是最高的字节的最低位。在进行低级的位运算处理的时候,在很多情况下Big-Endian的系统的的确确是会比Little-Endian多写一些代码。这就是为什么像x86这样的系统会选择Little-Endian的原因。
结果,两种情况都有了,两种支持者都拥有自己觉得的“自然”,最后的不“自然”留给了那些需要同时处理两种情况的人 —— 比如需要用x86处理网络上传输的2进制数据的人。他们很不爽的想:“为什么他们就不能统一一下呢?” —— 没办法,这个世界上总要有人吃亏,还是老老实实的做一个转换程序吧,往事不可以追,这个现况是不可能改变了。

 

 

==============================================================================

 

http://blog.csdn.net/iezzuchen/archive/2010/03/25/5416469.aspx

 

little endian和big endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式。

little endian把低字节存放在内存的低位地址;而big endian将低字节存放在内存的高位地址。

假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:

                        big-endian     little-endian
0x00000000     0x12              0xcd
0x00000001     0x23              0xab
0x00000002     0xab              0x34
0x00000003     0xcd              0x12
 
需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的。

现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian。

如何判断CPU是little endian还是big endian呢?

 

union
{
long Long;
char Char[sizeof(long)];
}u;

int main()
{
u.Long = 1;
if (u.Char[0] == 1)
{
printf("Little Endian!/n");
}
else if (u.Char[sizeof(long) - 1] == 1)
{
printf("Big Endian!/n");
}
else
{
printf("Unknown Addressing!/n");
}
return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值