文章目录
- 线索栏
- 笔记栏
-
- 引言部分
- [2.1.1 十六进制表示法](#2.1.1 十六进制表示法)
-
- 1)为什么是十六进制?
- 2)进制转换的核心方法与技巧
-
- [十六进制 ↔ 二进制(核心,必须掌握)](#十六进制 ↔ 二进制(核心,必须掌握))
- [2的幂次 ↔ 十六进制(快速技巧)](#2的幂次 ↔ 十六进制(快速技巧))
- [十进制 ↔ 十六进制(一般方法)](#十进制 ↔ 十六进制(一般方法))
- 混合进制运算
- 练习题
- 总结
线索栏
- 计算机内存的最小可寻址单位是什么?程序视角中的"内存"叫什么?
- C语言中"指针"的本质是什么?它和"类型"有什么关系?
- 为什么需要十六进制表示法?相比于二进制和十进制,它的优势是什么?
- 单个十六进制数字对应多少位二进制数?
- 如何快速将2的n次幂(如211)转换为十六进制?
- (复习)如何进行十六进制与二进制之间的快速转换?
- (复习)如何进行十进制与十六进制之间的转换?
笔记栏
引言部分
1)最小可寻址单位
字节(Byte, 8位)。
2)虚拟内存
机器级程序将内存视为一个巨大的字节数组,每个字节有唯一地址。此"统一视图"由DRAM、磁盘、OS等协作实现(详见第9章)。
3)指针(C语言)
(1)本质:一个存储块的首字节的虚拟地址。
(2)值与类型:指针的值是地址;类型指示了该地址起始处存储的对象的类型(如int*, float*)。编译器利用类型信息生成正确的机器指令,但机器码本身不包含类型信息。
(3)作用:引用数据结构(如数组)元素的机制。
2.1.1 十六进制表示法
1)为什么是十六进制?
(1)二进制:冗长,不便于人类阅读和书写。
(2)十进制:与位模式转换麻烦。
(3)十六进制:每1位十六进制数对应4位二进制数,转换直观,是二进制简洁的简写形式,是表示位模式的理想工具。
2)进制转换的核心方法与技巧
十六进制 ↔ 二进制(核心,必须掌握)
(1)Hex → Bin:将每个十六进制数字直接展开为4位二进制。
例:0x173A4C → 0001 0111 0011 1010 0100 1100
(2)Bin → Hex:从右向左每4位一组(最左一组可少于4位,左补0),每组转为1位十六进制。
例:11 1100 1010 1101 1011 0011 → 0011 1100 1010 1101 1011 0011 → 0x3CADB3
(3)记忆技巧:重点记住A(10), C(12), F(15)的十进制值,B(11), D(13), E(14)可推算。
2的幂次 ↔ 十六进制(快速技巧)
(1)若 x = 2n,其二进制为 1 后跟 n 个 0。
(2)十六进制中,每4个二进制0对应一个十六进制0。
(3)快速算法:将 n 表示为 i + 4j(0 ≤ i ≤ 3),则十六进制形式为:[1,2,4,8] 中第 i 个数字,后跟 j 个十六进制0。
例:211, n=11=3+4 * 2 → i=3对应开头数字8,j=2→跟2个0,结果为0x800。
十进制 ↔ 十六进制(一般方法)
(1)Dec → Hex(连除法):反复除以16,记录余数(转为十六进制数字),直到商为0。余数序列从后向前读即为结果。
例:314156 → 0x4CB2C(计算过程见教材)。
(2)Hex → Dec(乘权求和):每位数字乘以对应的16的幂次,然后求和。
例:0x7AF = 7 * 162+ 10 * 16 + 15 = 1967。
(3)工具:大数转换建议使用计算器或搜索引擎。
混合进制运算
(1)原则:统一进制后再计算。
(2)方法:将非十六进制数转换为十六进制,然后进行十六进制加减法。
例:0x503c + 64 → 64(Dec) = 0x40 → 0x503c + 0x40 = 0x507c。
十六进制加减法:逢16进1,借1当16。
练习题
(1)练习题2.1(进制转换)

A. 0x39A7F8→ 0011 1001 1010 0111 1111 1000
B. 1100 1001 0111 1011→ 0xC97B
C. 0xD5E4C→ 1101 0101 1110 0100 1100
D. 1001 1011 1001 1110 1101 0101→ 0x9B9ED5
答案:

(2)练习题2.2(2的幂次表)

运用 n = i + 4j速算法填充。例如 219, n=19=3+4 * 4→ 0x80000。
答案:

(3)练习题2.3(字节模式转换)

综合运用十进制、二进制、十六进制间的转换。例如十进制167:
167 = 128 + 32 + 4 + 2 + 1 → 二进制 1010 0111→ 十六进制 0xA7。
答案:

(4)练习题2.4(十六进制运算)

关键:将非十六进制数(如十进制64)先转换为十六进制(0x40)。
计算:如同十进制加减,注意进位/借位以16为基数。
A. 0x503c + 0x8 = 0x5044
B. 0x503c - 0x40 = 0x4ffc
C. 0x503c + 64 = 0x503c + 0x40 = 0x507c
D. 0x50ea - 0x503c = 0xAE
答案:

总结
本节构建了程序看待内存的基础模型------虚拟地址空间,并引入了C语言中指针作为地址引用的核心概念。为了高效地表示和操作内存中的位模式,十六进制表示法成为了关键工具。
必须熟练掌握的核心技能:
- 十六进制与二进制间的快速互转(基于4位一组的对应关系)。
- 2的幂次在十六进制中的表示规律(n = i + 4j速算法)。
- 在十六进制下直接进行算术运算(避免绕道十进制)。
这些技能是后续理解数据的具体存储格式(整数、浮点数)和进行底层调试(如用调试器查看内存内容)的必备前提。