不同 CPU 架構對多位元組資料的儲存順序不同:
例:0x12345678 在記憶體 0x4000 起始位置:
| 位址 | Little-endian | Big-endian |
|---|---|---|
| 0x4000 | 0x78 | 0x12 |
| 0x4001 | 0x56 | 0x34 |
| 0x4002 | 0x34 | 0x56 |
| 0x4003 | 0x12 | 0x78 |
union 所有成員共用同一塊記憶體,且皆從低位址開始存放。這意味著:
int a = 1(假設 32-bit,記憶體為 01 00 00 00 小端 / 00 00 00 01 大端)。char b(佔 1 位元組,取低位址字節)。0x01 → b == 1。0x00 → b == 0。int checkCPU(void) {
union {
int a;
char b;
} u;
u.a = 1;
return (u.b == 1); // 1 = Little-endian, 0 = Big-endian
}
優點:無條件分支、無位運算、可移植、極簡高效。
#include <stdint.h>
// C23 / C++20 標準巨集(部分編譯器已支援)
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define IS_LITTLE_ENDIAN 1
#else
#define IS_LITTLE_ENDIAN 0
#endif
htonl/ntohl 等轉換函數,不要假設本機位元序。is_little_endian() 執行期檢測,供內部序列化邏輯使用。union 利用「成員共享記憶體、偏移量為 0」的語言保證,將位元序檢測轉化為簡單的字節比較,是系統程式設計中「以最小代價獲取硬體資訊」的教科書級範例。