# 数制

> CIE A-Level 计算机科学 · 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u1-number-bases/

本模块讲解十进制、二进制和十六进制的位值表示法。你将学习如何对这几种进制之间的整数和分数进行相互转换，这是所有计算机科学主题的核心基础技能。

**先修:** 基础整数和分数算术

## 学习目标

- 对整数和分数进行十进制、二进制和十六进制之间的转换
- 解释不同数制的位值表示法
- 运用高效方法实现二进制与十六进制的转换
- 解答CIE 9618考试中要求的常见转换问题

## 位值表示法

**按位数制** — 一种数字表示系统，每个数字的值由数字本身及其相对于基数（小数点）点的位置共同决定。

*例:* 十进制使用10个数字（0-9），二进制使用2个数字（0-1）

对于任意基数$b$，基数点左侧最右位是$b^0$（个位）。向左每移动一位，指数增加1。基数点向右每移动一位，指数减少1。

$$\text{Value} = \sum_{i=0}^{n} d_i \times b^i + \sum_{j=1}^{m} f_j \times b^{-j}$$

**例题:** 计算$1011.1_2$的十进制值

1. 将每个数字对应到位值：
2. $$(1 \times 2^3) + (0 \times 2^2) + (1 \times 2^1) + (1 \times 2^0) + (1 \times 2^{-1})$$
3. 计算每一项：$8 + 0 + 2 + 1 + 0.5$
4. 对所有项求和得到最终结果：$11.5$

## 十进制整数转换为其他进制

将十进制整数转换为基数$b$，使用反复除法：反复将该数除以$b$，收集每次得到的余数，然后从后向前读取余数得到转换后的数。

**例题:** 将十进制数123转换为二进制

1. 反复除以2并收集余数：
2. 120 ÷ 2 = 61 余 1; 61 ÷ 2 = 30 余 1; 30 ÷ 2 = 15 余 0; 15 ÷ 2 = 7 余 1; 7 ÷ 2 = 3 余 1; 3 ÷ 2 = 1 余 1; 1 ÷ 2 = 0 余 1
3. 从后向前读取余数：$1111011_2$

**概念自测**

测试你的理解：

1. 十进制数47的十六进制是多少？

   - 2B
   - 1F
   - 31
   - 2F

   *解析:* 47 ÷ 16 = 2 余 15。15用F表示，因此结果是2F，且 2 × 16 + 15 = 47。

## 二进制与十六进制的相互转换

由于$16 = 2^4$，十六进制数字和4位二进制组（称为半字节）之间存在直接的1:1映射。这使得两种进制之间的转换非常快捷。

**例题:** 将$1101011011_2$转换为十六进制

1. 添加1个前导零使总位数能被4整除，然后从右向左分组为4位一组：$0011\ 0101\ 1011$
2. 将每个半字节映射为对应的十六进制数字：0011 = 3，0101 = 5，1011 = B
3. 结果：$35B_{16}$

**例题:** 将$2A.C_{16}$转换为二进制

1. 将每个十六进制数字映射为4位二进制：2 = 0010，A = 1010，C = 1100
2. 连接所有位得到：$00101010.1100_2$
3. 去掉多余的前导/后导零得到简化结果：$101010.11_2$

> **考试提示:** 始终使用这种直接分组法，不要通过十进制中转，这能在考试中节省大量时间。

## 十进制小数转换为其他进制

混合数的整数部分使用和之前相同的除法。对于基数点后的小数部分，使用反复乘法：反复将小数部分乘以$b$，收集结果的整数部分，然后从前向后读取整数部分。当小数部分变为0或达到要求的精度时停止。

> **warning**
>
> 小数转换的数字顺序与整数转换相反。先得到的数字是高位（更靠近基数点）。

**例题:** 将十进制小数0.625转换为二进制

1. 从小数部分0.625开始：
2. 0.625 × 2 = 1.25 → 整数部分 = 1，新小数部分 = 0.25
3. 0.25 × 2 = 0.5 → 整数部分 = 0，新小数部分 = 0.5
4. 0.5 × 2 = 1.0 → 整数部分 = 1，新小数部分 = 0 → 停止
5. 从前向后读取整数部分得到：$0.101_2$

## 常见错误

- **错误做法:** 将十进制整数转换为其他进制时，按收集顺序读取余数
  - 原因: 第一个得到的余数是最低位（最右侧）数字，因此必须反转顺序
  - 正确做法: 从最后得到的余数向第一个收集的余数读取，得到正确的数字顺序
- **错误做法:** 将十进制小数转换为其他进制时反转数字顺序
  - 原因: 第一个得到的整数部分是小数部分的最高位（最左侧）数字，因此顺序保持不变
  - 正确做法: 将整数部分按先得到后得到的顺序写出，得到小数结果
- **错误做法:** 进行十六进制转换分组二进制数字时，忘记添加前导/后导零
  - 原因: 如果总位数不是4的倍数，不补零分组会得到错误的半字节值
  - 正确做法: 给整数部分添加前导零，给小数部分添加后导零，使每个分组恰好为4位
- **错误做法:** 给基数点后的数字使用正指数
  - 原因: 基数点后的数字表示基数的分数，因此它们的位值使用负指数
  - 正确做法: 基数点后的第一个数字使用从-1开始的指数
- **错误做法:** 在十六进制中将10-15写为两个数字
  - 原因: 十六进制每个位值需要一个单独的数字，因此10-15必须用A-F表示
  - 正确做法: 对应关系：十进制10 = A，11 = B，12 = C，13 = D，14 = E，15 = F，每个数字对应一个字符

## 速查表

| 转换类型 | 方法 |
| --- | --- |
| 任意进制 → 十进制 | 每个数字乘以基数^位置，对所有项求和 |
| 十进制整数 → 基数b | 反复除以b，从后向前读取余数 |
| 十进制小数 → 基数b | 反复乘以b，从前向后读取整数部分 |
| 二进制 → 十六进制 | 分组为4位半字节，1:1映射为十六进制数字 |
| 十六进制 → 二进制 | 每个十六进制数字映射为4位二进制，连接所有位 |

## 下一步

数制是计算机科学中所有信息表示的基础构件。掌握进制之间的转换是理解几乎所有后续主题的前提，从二进制算术、负数表示到内存寻址和字符编码。该主题在CIE 9618的试卷1中持续考察，通常作为第一题来测试核心基础技能。接下来，你将在此知识基础上学习不同类型的数据（有符号整数、浮点数、文本）如何用二进制表示。

- [整数的二进制表示](https://www.owlsprep.com/zh/study/cie-9618-u1-binary-representation-of-integers/)
- [实数的二进制表示](https://www.owlsprep.com/zh/study/cie-9618-u1-binary-representation-of-real-numbers/)
- [字符编码](https://www.owlsprep.com/zh/study/cie-9618-u1-character-encoding/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u1-number-bases/
