C 语言大端小端与字节序
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
- 大端和小端到底差在哪?x86 是哪一种?
- 怎么用 C 检测本机字节序?
- 写二进制文件、发网络包,字节序错了会怎样?
一、什么是字节序
多字节整数在内存里从低地址到高地址的排列方式:
| 类型 | 排列 | 代表平台 |
|---|---|---|
| 小端(LE) | 低位字节在低地址 | x86、ARM(默认) |
| 大端(BE) | 高位字节在低地址 | 网络协议、部分 RISC |
0x12345678 在小端机内存里是 78 56 34 12,大端机是 12 34 56 78。
二、检测与转换
c
int x = 1;
char *p = (char *)&x;
printf("%s\n", *p ? "小端" : "大端");- 网络字节序 = 大端:
htons/htonl(主机→网络)、ntohs/ntohl(网络→主机)负责转换。 - 文件字节序:二进制文件用什么序必须约定好,读写双方一致;最常见的坑是"本机小端直接写、别处大端读"。
三、实际影响
- 网络协议:TCP/UDP 头、自定义协议字段都要用网络序,见 socket 内核实现。
- 二进制文件:跨机器传输的格式要固定字节序,或明确写入字节序标记。
- 性能:主机上保持本机序最快;转换只在 I/O 边界做。
四、与入门层的衔接
- 用 fread/fwrite 读写二进制时的字节序坑,见 fread/fwrite。
- 结构体内存布局(含字节序陷阱),见 结构体内存对齐。
- union 做字节访问的玩法,见 联合体。
一句话总结
字节序是"内存里的数字怎么排":x86 小端、网络大端,跨机器传数据必须显式转换,I/O 边界处理序、主机内部用本机序,性能与正确性兼得。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。