计算机的字节序
前言
字节序(Byte Order)指的是在计算机中,多字节数据(比如整数、浮点数等)在内存中存储的顺序。在计算机中,多字节数据通常会被分割成若干个字节,然后按照一定的顺序存储在内存中。
一、字节序的分类
计算机中的字节序分为大端字节序和小端字节序
大端字节序:数值的高位字节放在低位地址上,低位字节放在高位地址上(低字节在后,高字节在前)
小端字节序:数值的高位字节放在高位地址上,低位字节放在低位地址上(低字节在前,高字节在后)
内存中存放数字0X1A2B3C4D
在大端机器上存储方式为
内存地址 | 0X1000 | 0X1008 | 0X1010 | 0X1018 |
---|---|---|---|---|
存放数据 | 1A | 2B | 3C | 4D |
在小端机器上存储方式为
内存地址 | 0X1000 | 0X1008 | 0X1010 | 0X1018 |
---|---|---|---|---|
存放数据 | 4D | 3C | 2B | 1A |
不论是大端存储还是小端存储,存储的顺序都是由低地址向高地址,不同的是在取值时首先取低地址的数据放在低地址还是取高地址的数据放在低地址
大小端是数据在存储时的表现,不是运算时的表现,计算机在读取数据时,只会根据规则按顺序读取,数据类型就是为了让编译器知道每次该从哪个地址开始读取多少位的数据
举例:16位整数的读取规则,buf表示内存起始地址,offset表示正在读取的位置
大端字节序:
x = buf[offset] << 8 | buf[offset + 1]
小端字节序:
x = buf[offset + 1] << 8 | buf[offset]
二、字节序判断
linux操作系统中可以执行命令lscpu | grep "Byte Order"
获取字节序类型
通过代码判断字节序类型如下:
int main() {
union {
int a;
char b;
} data;
data.a = 1;
if (data.b == 1) {
cout << "Little Endian";
} else if (data.b == 0) {
cout << "Big Endian";
}
return 0;
}
三、字节序的适用场景
比对场景 | 大端 | 小端 | 说明 |
---|---|---|---|
可读性 | √ | 大端序高位在左,低位在右,符合从左到右的阅读习惯 | |
奇偶性检查 | √ | 检查个位数可以知道奇偶,小端序更方便 | |
正负数检查 | √ | 检查符号位可以知道正负,大端序更方便 | |
大小比较 | √ | 大端序需要读取所有的数据再进行比较,小端序读取时从个位开始,哪个数先读不到下一位就是最小的 | |
类型转换 | √ | 例如将32位整数转为16位整数(0X0001转为0X01),大端序(0 0 0 1)需要先截取前面两个字节,即指针后移两位,小端序(1 0 0 0)只需要截取最后两个字节,指针不需要移动 |
总结
计算机字节序是指计算机中的数据是如何组织的,包括整数、浮点数、字符、指针等。在大多数计算机中,字节序是指用8位字节来表示数据的顺序,也就是大小端序。不同的计算机体系结构和编译器可能会有不同的字节序实现方式,但通常都遵循着这种基本的存储顺序。在编写程序时,需要注意字节序的问题,特别是在跨平台或与不同体系结构的计算机交互时,确保数据的正确性和可移植性。