當 16/32 位元整數賦值給 8 位元 char 時,C 標準規定保留**低位元組**(Least Significant Byte),高位元組直接捨棄。本文以實測驗證此行為,並展示利用 union 檢測 CPU 大小端模式的經典技巧,兩者邏輯互為驗證。
int val = 4874; // 0x0000130A
char c = val; // 保留低位元組 0x0A → 'A' (ASCII 10)
printf("%x\n", c); // 輸出 a (十六進位 0A)
GCC 輸出 a,證實保留低位元組(Little-endian 行為一致)。
利用 union 讓 int 與 char 共用同一記憶體起始位址:
union { int i; char c; } u;
u.i = 0x12345678;
if (u.c == 0x78) puts("Little-endian"); // 低位元組在低地址
else if (u.c == 0x12) puts("Big-endian"); // 高位元組在低地址
| 位址 | Little-endian | Big-endian |
|---|---|---|
| 0x8000 | 0x78 | 0x12 |
| 0x8001 | 0x56 | 0x34 |
| 0x8002 | 0x34 | 0x56 |
| 0x8003 | 0x12 | 0x78 |
#include <stdio.h>
#include <stdlib.h>
int is_little_endian() {
union { int i; char c; } u = { .i = 0x12345678 };
return u.c == 0x78;
}
int main() {
int val = 4874;
char c = val;
printf("int 0x%x → char 0x%x (%s)\n", val, c & 0xFF,
is_little_endian() ? "Little-endian" : "Big-endian");
return 0;
}
htonl/ntohl)。理解「整數截斷保留低位元組」與「大小端決定低位元組在低/高地址」兩個獨立但相關的概念,是系統程式開發者的必修內功。