C 語言 union 所有成員共享同一塊內存,其內存佈局直接受 CPU 大小端模式決定。本文通過經典面試題實測驗證 x86 小端模式下 union {int i; char ch[2];} 的輸出差異,並解析大端模式下的理論結果。
#include <stdio.h>
union {
int i;
char ch[2];
} key;
int main(void) {
key.i = 65 * 256 + 66; // 0x4142
printf("%c %c\n", key.ch[0], key.ch[1]);
return 0;
}
B A
| 地址遞增 → | 低地址 | 高地址 |
|---|---|---|
| int i (0x4142) | 0x42 ('B') | 0x41 ('A') |
| ch[0] / ch[1] | ch[0] = 'B' | ch[1] = 'A' |
0x4142 低字節 0x42 ('B') 落在 ch[0],高字節 0x41 ('A') 落在 ch[1],故輸出 B A。0x4142,則 ch[0]='A'、ch[1]='B',輸出 A B。int 佔 4 字節,ch[2] 只覆蓋低 2 字節,高 2 字節保持為 0,大端下前兩字節為 0,輸出將是兩個不可見控制字符(空格/空字符)。htonl/ntohl 轉換,不可直接用 union 別名訪問。__attribute__((scalar_storage_order("big-endian"))) 強制結構體大端佈局(僅限標量字段),慎用。#include <stdio.h>
int main(void) {
union { uint32_t i; char c[4]; } u = {0x01020304};
printf("本機為 %s 模式\n", (u.c[0] == 0x04) ? "小端" : "大端");
return 0;
}