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 + 64 | 64 = 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 |
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、無計算器的純終端調試環境中游刃有餘。