端序(Endianness),又称字节序、尾序、位序。在计算机领域是指机器存放多字节数据的字节顺序。在涉及到低层数据存储和网络数据传输研究中都会涉及端序。
大端序(Big-Endian,大尾序):高位字节放在内存的低地址,低位字节放在内存的高地址。
小端序(Little-Endian,小尾序):低位字节放在内存的低地址,高位字节放在内存的高地址。
端序是与硬件的体系结构相关而与所使用的操作系统无关的概念,目前基本上所有x86系列的PC机都是小端序。
在32位机器上,对于数0x12345678来说,低层表示的方法因端序而排列不同
小端序: | 0x78 | 0x56 | 0x34 | 0x12 |
低地址 --0----------7-8-------15-16------23-24-------31--> 高地址
大端序: | 0x12 | 0x34 | 0x56 | 0x78 |
低地址 --0----------7-8-------15-16------23-24-------31--> 高地址
判定方法:
方法一:将整形int强制转换char测试
1 bool isBigEndian()2 {3 int a = 1;4 if (((char*)&a)[sizeof(int) - 1] == 1) {5 return true;6 } else {7 return false;8 }9 }
对于32位机器来说:
小端序: | 0x01 | 0x00 | 0x00 | 0x00 |
低地址 --0---[0]---7-8--[1]--15-16-[2]-23-24--[3]--31--> 高地址
大端序: | 0x00 | 0x00 | 0x00 | 0x01 |
低地址 --0---[0]---7-8--[1]--15-16-[2]-23-24--[3]--31--> 高地址
方法二:使用union,其所有成员共享同一个最大的内存地址。
1 bool isBigEndian() 2 { 3 union c 4 { 5 int a; 6 char b; 7 }; 8 c.a = 1; 9 10 if (c.b == 1) {11 return true;12 } else {13 return false;14 }15 }
在编程时使用移位操作,我们未感受到端序对代码的影响,是因为操作系统和编译器低层实现时屏蔽了这些细节,为编程人员提供了逻辑上的一致性操作,但是其实际物理上的操作会根据端序不同做出不同的处理方式。
历史上很多人对端序优劣的争执很情绪化,个人认为没有必要,并且也没有任何论证能证明两者之间的优劣。
相关故事:“端序”(endian)词语起源于《格利佛游记》。书中有一个故事:有一个国家发生了政变,分裂为两个国家,并且连年征战。而整个事件的起因是一派人赞成吃鸡蛋的时候应该先打破小的一端来吃,而另一派则主张应该打破大的一端来吃。双方还纷纷著书立说来阐述各自的道理。这是一个讥讽意味的故事,告诫大家不要做这种没有意义的争执。
参考博文: