union 允許不同類型成員佔用同一塊內存區域,大小等於最大成員尺寸。讀取較小成員時,實際讀取的是大成員內存的低地址部分——這恰好映射到字節序的差異。
int i = 1 在 Union 中的分布union Check { int i; char c; } cc;
cc.i = 1; // 0x00000001
| 模式 | 低地址 → 高地址 | cc.c 讀取值 |
|---|---|---|
| Little Endian | 01 00 00 00 | 1 (低位在前) |
| Big Endian | 00 00 00 01 | 0 (高位在前) |
#include
int checkSys() {
union {
int i;
char c;
} cc;
cc.i = 1;
return (cc.c == 1); // 1 = Little, 0 = Big
}
int main() {
if (checkSys())
printf("當前系統為小端模式\n");
else
printf("當前系統為大端模式\n");
return 0;
}
int checkSys() {
int i = 1;
return (*(char*)&i == 1);
}
本質相同:通過 char* 讀取 int 起始字節。
htonl/ntohl 轉換前需知宿主機序位域分配順序(從低位到高位 vs 高位到低位)同樣受大小端影響,跨平台位域解析需謹慎。
本文轉載自 “明” 博客,原文地址:https://8010089.blog.51cto.com/8000089/1304437