大端/小端模式決定多字節數據在內存中的存放順序,跨平台通訊、文件解析、網絡編程中頻繁遇到。本文講解概念、提供三種 C 語言檢測方法並分析原理。
| 模式 | 低地址存放 | 高地址存放 | 助記 |
|---|---|---|---|
| 大端 (Big-Endian) | 高位字節 | 低位字節 | 「大」在前 (高位在低地址) |
| 小端 (Little-Endian) | 低位字節 | 高位字節 | 「小」在前 (低位在低地址) |
例:`0x12345678` 在小端機 (x86) 內存順序為 `78 56 34 12`。
#include <stdio.h>
int main() {
short s = 0x1234;
char *p = (char *)&s;
printf("%p %02X %02X\n", &s, p[0], p[1]);
// 小端輸出: 34 12 (低位 0x34 在低地址)
// 大端輸出: 12 34
return 0;
}
直接觀察內存佈局,調試時最常用。
bool isLittleEndian() {
union {
int i;
char c;
} u;
u.i = 1;
return u.c == 1; // 小端: 低地址存低位 0x01 → c==1
}
聯合體成員共享起始地址,`int` 低位字節即 `char` 所見內容。
bool isLittleEndian() {
int val = 0x12345678;
short *p = (short *)&val;
return p[0] != 0x1234; // 小端: 低地址存 0x5678 ≠ 0x1234
}
同理利用地址別名特性,無需定義 union 類型。
極少數架構 (如 ARM 某模式) 32 位詞內小端,詞間大端。遇到時需逐字節解析,避免直接強轉。
掌握三種檢測法,面試、調試、跨平台開發全覆蓋!