判斷處理器大小端模式是嵌入式、系統程式設計的必考經典。利用 union 同一記憶體空間特性,可用零分支、零函數調用、極少指令完成檢測:
int checkCPU(void) {
union {
int a;
char b;
} c;
c.a = 1;
return (c.b == 1); // 1 = Little-endian, 0 = Big-endian
}
union 所有成員從相同低位址開始存放,佔用空間為最大成員大小。將 int a = 1(0x00000001)寫入後:
| 模式 | 記憶體佈局 (假設起始 0x4000) | c.b 讀取值 (第 0 位元組) | 返回值 |
|---|---|---|---|
| Little-endian | 0x4000: 0x01 0x4001: 0x00 0x4002: 0x00 0x4003: 0x00 |
0x01 | 1 (True) |
| Big-endian | 0x4000: 0x00 0x4001: 0x00 0x4002: 0x00 0x4003: 0x01 |
0x00 | 0 (False) |
MOV + CMP。// 16-bit
union { short s; char c; } u16; u16.s = 0x0001; bool le16 = u16.c == 1;
// 64-bit
union { long long ll; char c; } u64; u64.ll = 0x0000000000000001LL; bool le64 = u64.c == 1;
// 雙精度浮點 (IEEE 754)
union { double d; char c[8]; } uf; uf.d = 1.0; // 檢查 c[0]..c[7] 佈局
constexpr (C++11) 或宏,在編譯期確定大小端,消除運行開銷。#define IS_LITTLE_ENDIAN() ({ union { int i; char c; } u = {1}; u.c; })
htons/ntohs 等標準函數,勿手寫位移邏輯。Union 大小端檢測是硬體特性映射到語言特性的教科書級範例:以最小代價獲取關鍵架構資訊。面試時能寫出此解法並闡述記憶體佈局、union 語義、指令級優勢,即可展現扎實的系統底層功力。