首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CSAPP 習題 2.5 解答:大端法與小端法下多字節數值的字節序分布

     編輯:關於C語言

CSAPP 習題 2.5 解答:大端法與小端法下多字節數值的字節序分布

CSAPP 2.5 考察字節序:同一 32 位值 0x87654321 在大端/小端機器上的前 1/2/3 字節內容。這是網絡協議、文件格式、跨平台數據交換的核心知識點。

字節序定義回顧

模式最低地址存放最高地址存放典型架構
大端法最高有效字節 (MSB)最低有效字節 (LSB)網絡序、PowerPC、SPARC
小端法最低有效字節 (LSB)最高有效字節 (MSB)x86、x64、ARM (預設)

0x87 65 43 21 在內存中的分布(地址遞增方向 →)

大端法:  [87] [65] [43] [21]   ← 低地址存高位
小端法:  [21] [43] [65] [87]   ← 低地址存低位

習題標準答案

問題小端法大端法
A. 第 1 個字節(最低地址)0x210x87
B. 前 2 個字節0x21, 0x430x87, 0x65
C. 前 3 個字節0x21, 0x43, 0x650x87, 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;
}

跨平台最佳實踐

  1. 網絡傳輸:統一用大端序,發送前 htonl/htons,接收後 ntohl/ntohs。
  2. 文件存儲:約定字節序(如 PNG、BMP 規定大端;RIFF/WAV 用小端)。
  3. 共享內存/IPC:雙方協商或雙向轉換。
  4. 調試時:永遠用字節視圖看內存,不要只看整型解釋。

字節序問題不解決,跨平台數據交換必有隱患。CSAPP 2.5 以最小數值讓你建立「內存是字節序列、類型只是解釋方式」的本質認知。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved