计算机中,有个概念是字节序。
字节序指的是计算机在存储多字节的时候,字节的存储数据。
大端序和小端序概念
首先介绍两个概念 MSB和LSB
• MSB:最高有效位
• LSB :最低有效位
比如,5A6C中, 5A就是MSB 6C为LSB
大端序中,最高有效位(MSB)位于最低的地址,在小端序则相反,最低有效位(LSB)位于最低的位置。
比如对于数0x12345678中,若地址为0x10~0x13,那么对于大端序
- 0x10: 12
- 0x11: 34
- 0x12: 56
- 0x13: 78
小端序为:
- 0x10: 78
- 0x11: 56
- 0x12: 34
- 0x13: 12
可以看出,大端序可读性很好,从地址低到高就是我们的数,可读性很好,而小端序完全相反了。
为什么要有小端序呢?这是因为计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。 但是,大端序更符合人类的习惯。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
判断大端序or小端序
那么,假如面试的时候,面试官让你编写一个C函数,来确定一个计算机的字节序是大端序还是小端序,我们该怎么办呢?
我们知道,要看是大小端,我们只需要看最低的地址是高位还是低位,于是,我们可以用数字1,若是大端序,则最低地址应该为0,若为小端序,则最低地址应该为1。
那么对于一个int类型,如何才知道最低地址呢?
用一个char的指针指向一个int即可。
1 | bool isLittleEndian() { |
还可以用 union类型,union存放顺序是所有成员都从低地址开始存放。
1 | bool isLittleEndian() { |
可以看出,我们的计算机一般是用小端序的,需要注意的是JAVA是大端序的。