CSAPP 2.5 考察字節序:同一 32 位值 0x87654321 在大端/小端機器上的前 1/2/3 字節內容。這是網絡協議、文件格式、跨平台數據交換的核心知識點。
| 模式 | 最低地址存放 | 最高地址存放 | 典型架構 |
|---|---|---|---|
| 大端法 | 最高有效字節 (MSB) | 最低有效字節 (LSB) | 網絡序、PowerPC、SPARC |
| 小端法 | 最低有效字節 (LSB) | 最高有效字節 (MSB) | x86、x64、ARM (預設) |
大端法: [87] [65] [43] [21] ← 低地址存高位 小端法: [21] [43] [65] [87] ← 低地址存低位
| 問題 | 小端法 | 大端法 |
|---|---|---|
| A. 第 1 個字節(最低地址) | 0x21 | 0x87 |
| B. 前 2 個字節 | 0x21, 0x43 | 0x87, 0x65 |
| C. 前 3 個字節 | 0x21, 0x43, 0x65 | 0x87, 0x65, 0x43 |
#include <stdio.h>
int main() {
int x = 0x87654321;
unsigned char *p = (unsigned char *)&x;
printf("Byte 0: 0x%02X\n", p[0]);
printf("Byte 1: 0x%02X\n", p[1]);
printf("Byte 2: 0x%02X\n", p[2]);
printf("Byte 3: 0x%02X\n", p[3]);
// 小端機輸出: 21 43 65 87
// 大端機輸出: 87 65 43 21
return 0;
}
htonl/htons,接收後 ntohl/ntohs。字節序問題不解決,跨平台數據交換必有隱患。CSAPP 2.5 以最小數值讓你建立「內存是字節序列、類型只是解釋方式」的本質認知。