大端模式:數據的低位字節存放在高地址,高位字節存放在低地址 (類似人類閱讀順序)。
小端模式:數據的低位字節存放在低地址,高位字節存放在高地址 (x86/ARM 默認)。
例:32 位整數 0x01020304 在內存中 (地址遞增) 分佈:
| 地址 | 大端內容 | 小端內容 |
|---|---|---|
| 基址 +0 | 0x01 (高位) | 0x04 (低位) |
| 基址 +1 | 0x02 | 0x03 |
| 基址 +2 | 0x03 | 0x02 |
| 基址 +3 | 0x04 (低位) | 0x01 (高位) |
int check_endian(void) {
union {
int i;
char c;
} u;
u.i = 1; // 0x00000001
return (u.c == 1); // 小端返回 1,大端返回 0
}
原理:union 成員共享同一塊內存。int i = 1 只有最低位字節為 1。若 char c (佔據最低地址字節) 讀到 1,說明低地址存低位 → 小端;若讀到 0,說明低地址存高位 → 大端。
int check_endian_ptr(void) {
int i = 1;
return *(char *)&i; // 同理
}
// GCC/Clang
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
// 小端
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// 大端
#else
#error "Unknown endianness"
#endif
// MSVC
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64)
// 小端
#endif
#include → __BYTE_ORDERhtonl/ntohl (主機序↔網絡序大端) 隱含檢測htonl/ntohl、htons/ntohs 轉換。char* 訪問 int 內部字節時,結果取決於端序。read_u32_le/write_u32_be 等明確端序的 API。union 技巧驗證理解。大小端是計算機體系結構層面的約定差異。union 檢測法原理清晰、代碼極短,是面試經典;工程實踐中優先使用編譯器內建宏或標準庫常量 實現編譯期分支,消除運行時開銷。記住:網絡序=大端,x86/主流 ARM=小端,收發必轉換。