什么是字节序?
什么是字节序?
字节序指的是多字节数据在内存中的存储顺序。就像一本书可以从左往右读,也可以从右往左读一样,计算机存储多字节数据也有不同的顺序。
两种主要的字节序
1. 大端序 (Big-Endian)
- 高字节在前,低字节在后
- 就像我们写数字:1234,千位(1)在前,个位(4)在后
- 人类思维模式:从最重要的部分开始
存储示例:0x12345678 在内存中的存储
地址: 0x1000 0x1001 0x1002 0x1003
数据: 0x12 0x34 0x56 0x78
↑
最高有效字节(MSB)在前
2. 小端序 (Little-Endian)
- 低字节在前,高字节在后
- 就像倒着写数字:4321,个位(4)在前,千位(1)在后
- 计算机偏好:很多CPU架构采用这种方式
存储示例:0x12345678 在内存中的存储
地址: 0x1000 0x1001 0x1002 0x1003
数据: 0x78 0x56 0x34 0x12
↑
最低有效字节(LSB)在前
直观比喻
电话号码比喻
- 大端序:+86-138-0011-2233(国家码在前)
- 小端序:2233-0011-138-+86(本地号码在前)
日期格式比喻
- 大端序:2023-12-25(年-月-日)
- 小端序:25-12-2023(日-月-年)
实际代码示例
#include <stdio.h>
void check_endianness() {
int num = 0x12345678;
char *ptr = (char *)#
printf("数字: 0x%x\n", num);
printf("内存存储: ");
for(int i = 0; i < sizeof(int); i++) {
printf("%02x ", ptr[i] & 0xFF);
}
printf("\n");
if(ptr[0] == 0x78) {
printf("这是小端序系统\n");
} else {
printf("这是大端序系统\n");
}
}
int main() {
check_endianness();
return 0;
}
不同架构的偏好
| 架构 | 字节序 | 代表系统 |
|---|---|---|
| x86/x86-64 | 小端序 | Intel/AMD PC |
| ARM | 可配置 | 移动设备、嵌入式 |
| PowerPC | 大端序 | 旧苹果电脑、游戏机 |
| MIPS | 可配置 | 网络设备、嵌入式 |
| SPARC | 大端序 | 服务器 |
| RISC-V | 小端序 | 新兴架构 |
网络字节序
由于不同系统字节序不同,网络传输统一使用大端序:
#include <arpa/inet.h>
// 主机序转网络序(大端序)
uint32_t htonl(uint32_t hostlong); // 32位
uint16_t htons(uint16_t hostshort); // 16位
// 网络序转主机序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
实际应用中的重要性
- 文件格式:PNG、JPEG等使用大端序
- 网络协议:TCP/IP使用大端序
- 数据交换:不同系统间数据传输必须考虑字节序
- 内存映射:直接操作内存时需要知道字节序
如何选择?
- 性能考虑:小端序在某些操作上更有优势
- 兼容性:网络通信必须使用大端序
- 可读性:大端序更符合人类阅读习惯
浙公网安备 33010602011771号