一句话:"大在前是大端,小在前是小端;上网先转大端,收下再转回小端。"
大小端 = 多字节数据在内存里的排列顺序。判断看"最低地址字节存的是高字节还是低字节"。跨设备通信/存储必须约定字节序,本机内部(如寄存器)不用转。
int i = 0x12345678; → 小端内存 78 56 34 12,大端内存 12 34 56 78union { int i; char c; } u; u.i = 0x12345678; u.c == 0x78 ? 小端 : 大端;char *p = (char *)&i; *p == 0x78 ? 小端 : 大端;0x12345678,直接发内存字节 78 56 34 12,大端对方按 12 34 56 78 读 → 变成 0x78563412 错了 → 发送前 htonl(0x12345678),对方 ntohl 转回| 小端 little-endian | 大端 big-endian | |
|---|---|---|
| 低地址存 | 低字节(小的在前) | 高字节(大的在前) |
| 代表平台 | x86、ARM 主流 | 网络协议、MIPS 部分、某些 MCU |
| 记忆 | "小"在前 → 小端 | "大"在前 → 大端 |
union { int i; char c; } u; u.i = 0x11223344; → u.c = 0x11(大端高字节在低地址)uint16_t 0x0001 → 发送前用 htons(16 位用 short 版本,32 位才用 htonl);直接发字节序不一致会错值char *p = (char*)&i; (*p == 0x78) ? 'l' : 'h';| 相邻概念 | 和本主题的关系 | 孤立理解会犯的错 |
|---|---|---|
| struct vs union | union 测大小端:共用起始地址读首字节 | 忘了 union 成员同地址 |
| 通信协议 | 网络字节序 = 大端,本机 = 小端,收发前 htonl/ntohl | 直接发内存字节序导致错值 |
| 结构体对齐/pack | 协议帧 pack(1) + 字节序,两个一起考 | 只处理对齐忘了转字节序 |
| 嵌入式调试 | 和 PC 工具交换二进制数据要转字节序 | 以为本机内转来转去没用 |
2026-08-03
每主题一页,复习时只翻本目录。