| 模式 | 高位字節存放位置 | 低位字節存放位置 |
|---|---|---|
| Big-Endian (大端) | 低地址 | 高地址 |
| Little-Endian (小端) | 高地址 | 低地址 |
| 地址 | 小端內容 | 大端內容 |
|---|---|---|
| 0x4000 | 0x34 | 0x12 |
| 0x4001 | 0x12 | 0x34 |
int i = 1;
char *p = (char *)&i;
if (*p == 1)
printf("Little Endian");
else
printf("Big Endian");
原理:int 佔 4 字節,值 1 在小端模式下首字節為 0x01,大端模式下首字節為 0x00。
CPU 以「字」(通常 4 字節)為單位讀取內存。若 int 跨邊界存放(如地址 2~5),需兩次總線周期;對齊到 4 的倍數地址則一次讀取完成。
int 4 的倍數,short 2 的倍數,char 任意)。// 案例 1:普通成員
struct Test1 {
char x1; // 偏移 0
char x4; // 偏移 1
short x2; // 偏移 2 (2的倍數)
char x5; // 偏移 4
}; // sizeof = 6 (最大成員 short=2, 6是2的倍數)
// 案例 2:位域壓縮
struct Test2 {
char x1:2;
char x4:6; // 共 1 字節
char x2:7;
char x5:4; // 共 2 字節 (7+4=11>8, 換行)
}; // sizeof = 3
// 案例 3:位域溢出導致擴容
struct Test3 {
char x1:2;
char x4:7; // 9 bits > 8, 佔 2 字節
char x2:7;
char x5:4;
}; // sizeof = 4
#pragma pack(n) 或 __attribute__((packed)) 可強制修改對齊數,但可能降低訪存性能甚至觸發硬件異常(部分架構不支持非對齊訪問)。htonl/ntohl 系列),不可假設宿主機序。本文轉載自 “李海川” 博客,原文地址:https://lihaichuan.blog.51cto.com/498079/1304010