概述
机器是分大小端的,这对我们编程有什么影响呢?什么又是大小端呢?也许我们很多时候都不清楚,但仍然可以很好地使用电脑,或者编写代码。但我认为《圣经》里有句话说得很好,“你应该了解真相,真相会使你自由”。
所以这次,我要揭开“字节端”的面纱,共享科学之美。
小故事
Jonathan swift在1726年写的讽刺小说《格列佛游记》,小人国的内战就源于吃水煮鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生6次叛乱,其中一个皇帝送了命,另一个丢了皇位。
这就是Endian的由来。
大小端应用领域
各个体系的计算机通常采用的字节存储机制主要有两种:大端(Big-Endian)和小端(Little-Endian)
。
Little-Endian主要用于现在的pc机上,比如Intel的x86系列;Big-Endian主要指PowerPC系列处理器。
另外,目前的TCP/IP网络及Java虚拟机的字节序都是Big-Endian的,这意味着如果通过网络传输0x12345678这个整型变量,首先被发送的应该是0x12,接着0x34,0x56,0x78。所以我们的程序在处理网络流的时候,必须注意字节序的问题。
大小端原理
MSB:Most Significant Bit/Byte
,译为最重要的位或最重要的字节。
用来表明在一个bit序列(1byte是8个bit组成的序列)或一个byte序列(1word是2个byte组成的序列)中对整个序列取值影响最大的那个bit/byte。
LSB:Least Significant Bit/Byte
,译为最不重要的位或最不重要的字节。
用来表明在一个bit序列(1byte是8个bit组成的序列)或一个byte序列(1word是2个byte组成的序列)中对整个序列取值影响最小的那个bit/byte。
举个栗子
一个十六进制的整数:0x12345678
0x12就是MSB,0x78就是LSB。
而对于0x78这个字节,它的二进制值0x01111000,那么最左边的0就是MSB,最右边0就是LSB。
Big-Endian
Big-Endian其实就是规定MSB在存储时放在低地址,在传输时MSB放在流的开始;
LSB存储时放在高地址,在传输时放在流的末尾。
Little-Endian
Little-Endian其实就是规定MSB在存储时放在高地址,在传输时MSB放在流的末尾;
LSB存储时放在低地址,在传输时放在流的开始。
举个栗子
0x12345678
Big-Endian
地址0:0x12;地址1:0x34;地址2:0x56;地址3:0x78
Little-Endian
地址0:0x78;地址1:0x56;地址2:0x34;地址3:0x12
总结
其实大小端很简单只需了解几点:
- 大小端是由硬件决定的,小端主要是x86处理器,大端主要是PowerPC;
- 大小端是一种字节存储机制;
- 大端是最重要的字节存储在低地址;
- 小端是最重要的字节存储在高地址。