union判断大小端最可靠:给int赋值1后读char首字节,为1则小端,否则大端;因union成员共享起始地址,直接反映内存布局,不依赖编译器优化或对齐,跨平台安全可移植。

直接结论:用 union 判断大小端最可靠、最轻量,核心就一句 —— 给 int 成员赋值 1,读 char 成员是否为 1;是则小端,否则大端。
为什么 union 能测大小端
union 所有成员共享起始地址(偏移 0),char 成员只读首字节,int 成员写入多字节值。当执行 c.i = 1(即 0x00000001)时:
- 小端下内存布局是
01 00 00 00,c.c读到的是低地址的0x01 - 大端下是
00 00 00 01,c.c读到的是低地址的0x00
这个行为不依赖编译器优化、无符号扩展或对齐填充,是内存布局的直接反映。
标准写法与常见错误
正确且可移植的写法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
bool is_little_endian() {
union { int i; char c; } u;
u.i = 1;
return u.c == 1;
}
容易踩的坑:
- 别用全局
union变量 —— 某些嵌入式平台或严格初始化要求下,未显式初始化的静态union可能被清零,导致误判 - 别在函数外定义并初始化(如
union { int i; char c; } u = {.i = 1};)—— C++11 起允许,但部分旧编译器(如某些 ARM GCC 4.9)会报错或行为未定义 - 别用
short+char[2]组合来测 —— 若平台short对齐为 2 字节,而union总大小被填充,char[0]不一定对应short的最低字节(尤其在非默认对齐下)
跨平台兼容性注意事项
这个方法在所有主流平台(x86/x64、ARM32/ARM64、RISC-V)和编译器(GCC、Clang、MSVC)上都成立,但要注意:
-
int必须至少 2 字节 —— C++ 标准保证sizeof(int) >= 2,实际几乎全是 4 字节,足够覆盖大小端差异 - 不要假设
char是signed char—— 用unsigned char更稳妥,但比较== 1时无实质影响 - MSVC 在 `/Za`(禁用扩展)模式下仍支持匿名
union,但若需 C 兼容,应命名并声明变量
真正容易被忽略的是:这个判断必须在运行时做,不能靠预编译宏(如 __BYTE_ORDER__)替代 —— 因为交叉编译时宏反映的是构建机而非目标机的端序,而 union 测试永远反映真实运行环境。

















