0%

大端序和小端序

计算机中,有个概念是字节序。

字节序指的是计算机在存储多字节的时候,字节的存储数据。 ## 大端序和小端序概念

首先介绍两个概念 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
2
3
4
5
bool isLittleEndian() {
int testNum = 1;
char * p = (char *)&testNum;
return *p;
}

还可以用 union类型,union存放顺序是所有成员都从低地址开始存放。

1
2
3
4
5
6
7
8
bool isLittleEndian() {
union {
int testNum;
char singleByte;
} test;
test.testNum = 1;
return test.singleByte;
}

可以看出,我们的计算机一般是用小端序的,需要注意的是JAVA是大端序的。

请我喝杯咖啡吧~