大小端是CPU对多字节数据在内存中的存放顺序,是嵌入式、网络通信、二进制协议开发中必踩的底层知识点,与语法无关,却直接决定数据解析是否正确。
一、大小端的本质
大端序(Big-Endian)
数据高字节存低地址,低字节存高地址,和人类书写顺序一致。
例:0x12345678→ 内存:12 34 56 78小端序(Little-Endian)
数据低字节存低地址,高字节存高地址。
x86、ARM 等主流 CPU 默认都是小端。
例:0x12345678→ 内存:78 56 34 12
二、C 语言判断大小端(最简代码)
利用 union 共享内存特性,直接读取首字节判断:
#include <stdio.h>
int is_little_endian() {
union {
int n;
char c;
} u;
u.n = 1;
// 首字节为1 → 小端;为0 → 大端
return u.c == 1;
}
int main() {
if (is_little_endian())
printf("小端序\n");
else
printf("大端序\n");
return 0;
}
三、最容易踩坑的 3 个场景
网络传输
网络字节序统一为大端,本机发数据必须用htons / htonl转序,接收用ntohs / ntohl转回,否则数据乱码。二进制文件/Flash 存储
不同架构设备读写同一文件,不做字节序转换,解析结果完全错误。指针强转解析多字节数据
直接用char*读取int数据时,大小端不同,取出的字节顺序完全相反。
四、总结
大小端是硬件架构决定的内存规则,不是 C 语言语法,但直接影响跨平台、网络、底层数据交互。
写底层协议、驱动、跨端数据交互时,永远假设大小端未知,用通用转序逻辑,才是稳健的 C 语言开发思路。