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

CSAPP 習題 2.4 解答:十六進制算術心算技巧(不轉二進制直接算)

     編輯:關於C語言

CSAPP 習題 2.4 解答:十六進制算術心算技巧(不轉二進制直接算)

CSAPP 2.4 要求不將十六進制轉為二進制,直接在十六進制域完成加減運算。這考察對十六進制位權(16^n)的直觀掌握,是系統級調試、內存地址計算的核心技能。

題目與標準答案

表達式計算過程結果
A. 0x503C + 0x8低位:C(12) + 8 = 20(0x14) → 寫 4,進 1
次位:3 + 1(進位) = 4
高位保持:50
→ 0x5044
0x5044
B. 0x503C - 0x40減法對齊:0x503C - 0x0040
低位:C - 0 = C
次位:3 - 4 不夠,向高位借 1 (16)
3+16=19, 19-4=15(0xF),高位 0 變 F,再借 1 → 5 變 4
→ 0x4FFC
0x4FFC
C. 0x503C + 6464 = 0x40
0x503C + 0x0040 = 0x507C
0x507C
D. 0x50EA - 0x503C對齊減:EA - 3C
低位:A(10) - C(12) 不夠,借 1 → 1A(26)-C=E(14)
高位:E(14) - 1(借位) - 3 = A(10)
→ 0xAE (原文 0xBD 為筆誤,正確 0xAE)
0xAE

十六進制心算三板斧

  1. 對齊位權:右對齊,高位補 0(如 0x8 → 0x0008)。
  2. 進位/借位基數 16:A=10, B=11, C=12, D=13, E=14, F=15。
  3. 拆解大數:0x503C = 0x5000 + 0x3C,分段計算再合併。

實戰場景

  • 調試器斷點:bp 0x401000 + 0x3C 快速算出地址。
  • 內存映射:base + offset 現算現用,無需計算器。
  • 位掩碼構造:~0xFFF 對齊 4KB 頁邊界。

驗證小程序(可選)

#include <stdio.h>
int main() {
    printf("%X\n", 0x503C + 0x8);   // 5044
    printf("%X\n", 0x503C - 0x40);  // 4FFC
    printf("%X\n", 0x503C + 64);    // 507C
    printf("%X\n", 0x50EA - 0x503C);// AE
    return 0;
}

熟練十六進制心算,能讓你在無 IDE、無計算器的純終端調試環境中游刃有餘。

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