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 位二进制。
- 195 $\ge$ 128 吗?是的。在 128 下面写 1。余数:\(195 - 128 = 67\)。
- 67 $\ge$ 64 吗?是的。在 64 下面写 1。余数:\(67 - 64 = 3\)。
- 3 $\ge$ 32 吗?不是。写 0。
- 3 $\ge$ 16 吗?不是。写 0。
- 3 $\ge$ 8 吗?不是。写 0。
- 3 $\ge$ 4 吗?不是。写 0。
- 3 $\ge$ 2 吗?是的。写 1。余数:\(3 - 2 = 1\)。
- 1 $\ge$ 1 吗?是的。写 1。余数:\(1 - 1 = 0\)。
最终的 8 位二进制结果为 11000011。
B. 正二进制转换为十进制
只需将每一位的权重乘以该位的二进制数字(0 或 1),然后将结果相加即可。
示例: 将二进制 01010101 转换为十进制。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
计算:\((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 转换为十六进制。
- 用 250 除以 16:\(250 \div 16 = 15\),余数为 \(10\)。
- 将余数 (10) 转换为十六进制符号:A。这是最低有效位 (LSD)。
- 将商 (15) 转换为十六进制符号:F。这是最高有效位 (MSD)。
十六进制结果为 FA。
B. 十六进制转换为十进制
十六进制的数位权重是 16 的幂(\(16^0=1\),\(16^1=16\),\(16^2=256\),依此类推)。
示例: 将十六进制 3F 转换为十进制。
- 拆分十六进制数字:3 和 F。记住 F = 15。
- 将每一位的权重乘以该数字的十进制等价值。
\((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 转换为二进制。
- 拆分数字:A 和 5。(A 在十进制中为 10)。
- 使用 4 位权重(8, 4, 2, 1)转换 A (10):\(8+2 = 10 \rightarrow \mathbf{1010}\)
- 使用 4 位权重(8, 4, 2, 1)转换 5:\(4+1 = 5 \rightarrow \mathbf{0101}\)
合并结果:10100101。
B. 二进制转换为十六进制
从右向左,每 4 位二进制分为一组,然后将每一组转换成一个十六进制数字。
示例: 将二进制 11110011 转换为十六进制。
- 分组:
\(\mathbf{1111} \ \ \ \ \ \ \ \ \mathbf{0011}\) - 转换左侧组 (\(1111\)):\(8+4+2+1 = 15\)。十六进制符号:F。
- 转换右侧组 (\(0011\)):\(2+1 = 3\)。十六进制符号:3。
十六进制结果为 F3。
核心要点:转换
十六进制只是二进制的一种便捷简写。 如果需要通过十六进制在十进制和二进制之间转换,先进行“十进制 $\leftrightarrow$ 十六进制”转换,再进行“十六进制 $\leftrightarrow$ 二进制”转换。转换的诀窍永远是将二进制字符串按 4 位一组进行划分。
3. 十六进制的用途
3.1 理解其优势
既然计算机使用二进制,人类使用十进制,为什么还要费心使用十六进制呢?
十六进制作为一种有效的数据表示方法,原因如下:
- 它更短: 十六进制为长二进制串提供了简洁的表示方式。一个 16 位的二进制数(如 1101001011110000)只需 4 个十六进制数字(D2F0)即可表示。这减少了人类在转录或阅读数据时出错的概率。
- 对人类更友好: 程序员阅读和记忆“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。空位用零填充。
- 二进制补码用于表示负数。最高有效位(最左位)是符号位。