1.1 数制:计算机数据的基石

你好!本章我们将学习计算机的“秘密语言”。你在屏幕上看到的一切——文字、图像、声音和数字——首先都必须转换成计算机能够理解的电脉冲序列。这个过程被称为数据表示(Data Representation)

别担心数学运算看起来很复杂,我们会将每一次转换拆解成简单易懂的步骤和技巧!

为什么计算机只用二进制(基数为 2)

人类使用十进制(基数为 10),这是因为我们有 10 根手指。然而,计算机是靠电力工作的。计算机只需要区分两种状态:开(ON)关(OFF)

  • 开(ON)用数字 1 表示。
  • 关(OFF)用数字 0 表示。

因为它只使用两个数字(0 和 1),所以被称为二进制(Binary)系统(基数为 2)。

关键术语: 单个二进制数字(0 或 1)被称为位(Bit)。计算机将这些位存储在称为寄存器(Registers)的临时存储区域中。


快速回顾:需要掌握的数制
  • 十进制(Denary/Decimal):基数为 10(使用数字 0–9)。这是我们日常生活中使用的系统。
  • 二进制(Binary):基数为 2(使用数字 0 和 1)。这是计算机的母语。
  • 十六进制(Hexadecimal/Hex):基数为 16(使用数字 0–9 和字母 A–F)。这是程序员常用的便捷缩写。

2. 数制间的转换

我们需要能够在这三种基数之间进行转换。请记住:考试不允许使用计算器,因此理解数位权重(column headings)至关重要!

2.1 十进制(基数 10)与二进制(基数 2)的转换

在任何数制中,数字的位置决定了它的权重。在二进制中,权重是 2 的幂。我们通常使用 8 位(即一个字节 Byte)来进行表示,但考纲要求掌握最高 16 位的转换。

8 位二进制的权重表如下:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1

A. 十进制转换为正二进制

我们使用减法法。从小于或等于十进制数的最大权重列开始计算。

示例: 将十进制数 195 转换为 8 位二进制。

  1. 195 $\ge$ 128 吗?是的。在 128 下面写 1。余数:\(195 - 128 = 67\)。
  2. 67 $\ge$ 64 吗?是的。在 64 下面写 1。余数:\(67 - 64 = 3\)。
  3. 3 $\ge$ 32 吗?不是。写 0
  4. 3 $\ge$ 16 吗?不是。写 0
  5. 3 $\ge$ 8 吗?不是。写 0
  6. 3 $\ge$ 4 吗?不是。写 0
  7. 3 $\ge$ 2 吗?是的。写 1。余数:\(3 - 2 = 1\)。
  8. 1 $\ge$ 1 吗?是的。写 1。余数:\(1 - 1 = 0\)。

最终的 8 位二进制结果为 11000011

B. 正二进制转换为十进制

只需将每一位的权重乘以该位的二进制数字(0 或 1),然后将结果相加即可。

示例: 将二进制 01010101 转换为十进制。

1286432168421
01010101

计算:\((0 \times 128) + (1 \times 64) + (0 \times 32) + (1 \times 16) + (0 \times 8) + (1 \times 4) + (0 \times 2) + (1 \times 1)\)
\(= 0 + 64 + 0 + 16 + 0 + 4 + 0 + 1 = 85\)

十进制结果为 85


2.2 十进制(基数 10)与十六进制(基数 16)的转换

十六进制使用 16 个符号。我们需要为 10 到 15 的数字定义新的符号:

A = 10, B = 11, C = 12, D = 13, E = 14, F = 15

A. 十进制转换为十六进制

使用除法法。将十进制数除以 16。

示例: 将十进制数 250 转换为十六进制。

  1. 用 250 除以 16:\(250 \div 16 = 15\),余数为 \(10\)。
  2. 将余数 (10) 转换为十六进制符号:A。这是最低有效位 (LSD)
  3. 将商 (15) 转换为十六进制符号:F。这是最高有效位 (MSD)

十六进制结果为 FA

B. 十六进制转换为十进制

十六进制的数位权重是 16 的幂(\(16^0=1\),\(16^1=16\),\(16^2=256\),依此类推)。

示例: 将十六进制 3F 转换为十进制。

  1. 拆分十六进制数字:3 和 F。记住 F = 15。
  2. 将每一位的权重乘以该数字的十进制等价值。
    \((3 \times 16) + (F \times 1)\)
    \((3 \times 16) + (15 \times 1)\)
    \(= 48 + 15 = 63\)

十进制结果为 63


2.3 十六进制与二进制的转换(最简单的方法!)

由于 \(16 = 2^4\),一个十六进制数字总是可以用正好 4 位二进制(即一个半字节 nibble)来完美表示。这就是所谓的“快捷”转换。

A. 十六进制转换为二进制

将每个十六进制数字转换为对应的 4 位二进制码。

示例: 将十六进制 A5 转换为二进制。

  1. 拆分数字:A 和 5。(A 在十进制中为 10)。
  2. 使用 4 位权重(8, 4, 2, 1)转换 A (10):\(8+2 = 10 \rightarrow \mathbf{1010}\)
  3. 使用 4 位权重(8, 4, 2, 1)转换 5:\(4+1 = 5 \rightarrow \mathbf{0101}\)

合并结果:10100101

B. 二进制转换为十六进制

从右向左,每 4 位二进制分为一组,然后将每一组转换成一个十六进制数字。

示例: 将二进制 11110011 转换为十六进制。

  1. 分组:
    \(\mathbf{1111} \ \ \ \ \ \ \ \ \mathbf{0011}\)
  2. 转换左侧组 (\(1111\)):\(8+4+2+1 = 15\)。十六进制符号:F
  3. 转换右侧组 (\(0011\)):\(2+1 = 3\)。十六进制符号:3

十六进制结果为 F3

核心要点:转换

十六进制只是二进制的一种便捷简写。 如果需要通过十六进制在十进制和二进制之间转换,先进行“十进制 $\leftrightarrow$ 十六进制”转换,再进行“十六进制 $\leftrightarrow$ 二进制”转换。转换的诀窍永远是将二进制字符串按 4 位一组进行划分。

3. 十六进制的用途

3.1 理解其优势

既然计算机使用二进制,人类使用十进制,为什么还要费心使用十六进制呢?

十六进制作为一种有效的数据表示方法,原因如下:

  1. 它更短: 十六进制为长二进制串提供了简洁的表示方式。一个 16 位的二进制数(如 1101001011110000)只需 4 个十六进制数字(D2F0)即可表示。这减少了人类在转录或阅读数据时出错的概率。
  2. 对人类更友好: 程序员阅读和记忆“A4”比阅读和记忆“10100100”要简单得多。

3.2 十六进制在计算机科学中的应用

你会在以下领域发现十六进制的使用:

  • MAC 地址: 网卡的唯一物理地址(例如:00-1A-C2-7B-00-47)。
  • 内存转储(Memory Dumps): 当程序员需要检查内存(寄存器或 RAM)中的原始内容时,为了便于阅读,数据会以十六进制显示。
  • HTML 颜色代码: 网页上的颜色通常用 6 位十六进制数字表示(例如:#FF0000 代表纯红色)。

4. 二进制算术:加法与溢出

4.1 两个 8 位正二进制整数的加法

二进制加法遵循简单的规则。你只需要处理 0 和 1:

  • \(0 + 0 = 0\)
  • \(1 + 0 = 1\)
  • \(1 + 1 = 0\),进位 1(就像十进制中 5+5=0 进位 1 一样)
  • \(1 + 1 + 1 = 1\),进位 1

示例: 将二进制 01010010 (82) 和 00001011 (11) 相加。

     进位行: 1 1
  01010010 (82)
+ 00001011 (11)
----------
  01011101 (93)

4.2 理解溢出(Overflow)的概念

当计算结果太大,超出了分配的存储空间(即寄存器)时,就会发生溢出错误(Overflow error)

在 IGCSE 考纲中,我们重点关注 8 位寄存器。

  • 8 位寄存器所能容纳的最大正整数是 11111111(十进制中的 255)。
  • 如果你相加两个数,结果需要第 9 位,就发生了溢出。

溢出示例: 将 150 和 150 相加(两者都在 8 位范围内)。结果应该是 300。

     进位行: 1 1 1 1 1 1
  10010110 (150)
+ 10010110 (150)
----------
$\mathbf{1}\ $ 00101100 (44)

第 9 位(加粗部分)被称为溢出位(overflow bit)。由于寄存器只有 8 位空间,计算机只会存储 00101100 (44),导致答案错误并触发溢出错误。

类比: 想象一下往只能装 255 毫升水的杯子里倒入 300 毫升果汁。多出来的部分溢出了,杯子(寄存器)里只留下了最大承载量,丢失了真正的结果。

记忆辅助:溢出

如果使用 8 位寄存器时,十进制总和超过 255,就会发生溢出。

5. 特殊二进制技术

5.1 二进制逻辑移位

二进制逻辑移位是一种快速操作,它将寄存器中的所有位向左或向右移动。

执行移位时:

  • 从寄存器末端移出的位将丢失
  • 在另一端产生的空位用填充。
A. 逻辑左移

左移等同于将数字乘以 2 的幂。

规则: 每向左移一位,数字乘以 2。

示例: 二进制 00000101 (5)。向左移 2 位。

  • 两个位 (00) 从右侧移入。
  • 最高位的两个位 (00) 被移出并丢失。


\(00000101 \rightarrow \mathbf{00010100}\) (十进制 20)。
(原始值 5 乘以 \(2^2\),即 4,结果为 20)。

B. 逻辑右移

右移等同于将数字除以 2 的幂。

规则: 每向右移一位,数字除以 2。

示例: 二进制 00101000 (40)。向右移 3 位。

  • 三个零 (000) 从左侧移入。
  • 最低位的三个位 (000) 被移出并丢失。(这会导致整数除法,余数被舍弃)。


\(00101000 \rightarrow \mathbf{00000101}\) (十进制 5)。
(原始值 40 除以 \(2^3\),即 8,结果为 5)。

你知道吗?

移位是进行乘除运算的极快方式。计算机在汇编语言中使用移位代替传统算术运算,从而迅速完成计算。

5.2 二进制补码(Two's Complement):表示负数

到目前为止,我们只观察了正整数(0 到 255)。计算机如何表示负数呢?它使用二进制补码(Two's Complement)

二进制补码使我们能够在同一个寄存器中存储正整数和负整数。

符号位(Sign Bit)

使用二进制补码时(以我们的 8 位示例为例):

  • 最高有效位 (MSB)(最左边的位,128 列)成为符号位
  • 如果 MSB 为 0,则数字为正数
  • 如果 MSB 为 1,则数字为负数

8 位二进制补码的表示范围为 -128 到 +127。

转换步骤(正十进制转负二进制补码)

将十进制数(例如 -42)转换为 8 位二进制补码的表示:

第 1 步:写出正二进制数。
\(42 = 00101010\)

第 2 步:求反码(翻转每一位)。
将所有的 0 变为 1,将所有的 1 变为 0。
\(00101010 \rightarrow \mathbf{11010101}\)

第 3 步:加 1。
  11010101
+               1
----------
  \(\mathbf{11010110}\)

-42 的 8 位二进制补码是 11010110。(注意 MSB 是 1,表示这是一个负数)。

转换步骤(负二进制补码转回十进制)

将负二进制数(例如 11010110)转回十进制:

第 1 步:求反码(翻转每一位)。
\(11010110 \rightarrow 00101001\)

第 2 步:加 1。
  00101001
+               1
----------
  00101010

第 3 步:将得到的正二进制转回十进制。
\(00101010 = 32 + 8 + 2 = 42\)

由于我们开始时的符号位是负数 (1),因此原始数字一定是 -42


章节总结:核心要点
  • 二进制是基数 2(0 和 1),因为计算机依赖两种电状态(开/关)。
  • 十六进制(基数 16)是二进制的缩写表示,让长二进制串对人类而言更易于管理(4 位二进制 = 1 位十六进制)。
  • 二进制加法在 \(1+1\) 时需要进位 1。
  • 如果在 8 位加法中结果超过 255,会发生溢出(生成第 9 位并丢失)。
  • 左移相当于乘以 2;右移相当于除以 2。空位用零填充。
  • 二进制补码用于表示负数。最高有效位(最左位)是符号位。