2. 字节序
字节序是指计算存储多字节数据(如:short int、int、float、double等)时,各个字节在内存中的排列顺序。
字节序分为两种:
- 大端字节序(Big Endian)。
- 低位字节存储在高地址,高位字节存储在低地址。
- 小端字节序(Little Endian)。
- 低位字节存储在低地址,高位字节存储在高地址。
通常字节序是 CPU 的运行模式决定的。现代计算机系统中,一般台式电脑,服务器等都使用小端字节序,而一些网络设备的路由器,交换机等的处理器通常使用大端字节序。
字节序在数据存储和数据通信领域尤为重要。一般网络通信协议中要规定数值的字节序(大端或小端二选一),否则可能会引起数据出错。
下面以四个字节的无符号整数为例来说明整数在不同字节序下的数据存放顺序。
如无符号整型变量 x 的定义如下:
unsigned int x = 0x04030201;
小端字节序存放方式:
+------+------+------+------+
| 0x01 | 0x02 | 0x03 | 0x04 |
+------+------+------+------+
低地址 高地址
大端字节序存放方式:
+------+------+------+------+
| 0x04 | 0x03 | 0x02 | 0x01 |
+------+------+------+------+
低地址 高地址
字节序检测方法
我们可以使用联合体对运行程序的字节序进行检测。
如上图所示的存放顺序,我们定义一个联合体,如下:
union byte_order {
unsigned char buf[4];
unsigned int x;
} bo;
我们将 整数 0x04030201 赋值给 bo.x,然后判断最低位字节 bo.buf[0],如果 bo.buf[0] 的值是 0x01 则说明你的系统是小端字节序。如果是 0x04 则是大端字节序。
示例:
// filename: byte_order.c
#include <stdio.h>
int main(int argc, char * argv[]) {
union {
unsigned char buf[4];
unsigned int x;
} bo;
bo.x = 0x04030201;
if (bo.buf[0] == 0x01) {
printf("此电脑是小端字节序。\n");
} else if (bo.buf[0] == 0x04) {
printf("此电脑是小端字节序。\n");
} else {
printf("这是不可能出现的情况!\n");
}
return 0;
}
编译和运行结果如下:
weimingze@mzstudio:~$ gcc -o byte_order byte_order.c
weimingze@mzstudio:~$ ./byte_order
此电脑是小端字节序。
实验:
测试你的电脑是大端字节序还是小端字节序。