union StateMachine {
char character;
int number;
char *str;
double exp;
}; // 大小 = sizeof(double) = 8 字節 (64位)
union {
int i;
char a[2];
} *p, u;
p = &u;
p->a[0] = 0x39;
p->a[1] = 0x38;
| 模式 | 內存佈局 (低地址→高地址) | p->i 值 |
|---|---|---|
| 大端 | 0x39, 0x38, 0x00, 0x00 | 0x39380000 |
| 小端 | 0x38, 0x39, 0x00, 0x00 | 0x00003839 |
因 Union 所有成員偏移均為 0,a[0] 對應 i 的最低/最高字節,直接反映端序。
int check_endianness(void) {
union {
int i;
char c;
} u = { .i = 1 };
return u.c == 1; // 1 = Little Endian, 0 = Big Endian
}
原理:int i = 1 內存中只有最低字節為 1。小端模式最低字節在低地址,c 讀到 1;大端模式最低字節在高地址,c 讀到 0。

圖 內存中 0x01 位於低地址,確認當前為小端模式
#includeint main() { int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)(&a + 1); // &a 是 int(*)[5],+1 跳過整個數組 int *ptr2 = (int *)((int)a + 1); // a 轉整數 +1,僅偏移 1 字節 printf("%x, %x\n", ptr1[-1], *ptr2); return 0; }
ptr1 指向數組尾後,ptr1[-1] 即最後一個元素 5 (0x5)ptr2 指向 a[0] 低地址偏移 1 字節處,讀取 4 字節得到 00 00 00 02(小端),即 0x02000000htons/htonl/ntohs/ntohl 轉換memcpy 或 _Static_assert 配合 alignasUnion 共享內存特性使其成為檢測大小端、零拷貝類型轉換的利器。理解「低地址存低字節(小端) / 高字節(大端)」並能手寫檢測代碼,是系統級 C 程序員基本功。