欢迎来到二进制的世界!
你有没有想过,电脑本质上只是一堆微小的电子开关,它是如何理解像你最喜欢的电子游戏或数学作业这样复杂的事物呢?这一切归根结底,都要归功于二进制系统 (binary number system)。在本章中,我们将学习这门“0 与 1 的语言”,并了解电脑如何处理从简单的计数到复杂的小数等各种运算。
3.5.3.1 无符号二进制 (Unsigned Binary)
电脑最基础的计数方式是使用无符号二进制。“无符号”简单来说就是指该数值永远为正数(没有正负号)。
在一个拥有 n 个位元 (bits) 的二进制系统中(每个位元可以是 1 或 0):
- 最小值永远是 0(所有位元皆为 0)。
- 最大值使用以下公式计算:\( 2^n - 1 \)。
例子:如果你有 8 个位元(即 1 个字节/byte),你可以表示的最大值是 \( 2^8 - 1 \),即 \( 256 - 1 = 255 \)。因此,一个 8 位元的无符号整数可以表示从 0 到 255 的任何整数。
重点小笔记:
无符号 (Unsigned) = 仅限正数。
范围 (Range) = \( 0 \) 到 \( 2^n - 1 \)。
3.5.3.2 无符号二进制算术
二进制的加法和乘法与你在小学学到的十进制运算非常相似,只是需要处理的数字更少,更简单!
二进制加法规则:
- \( 0 + 0 = 0 \)
- \( 0 + 1 = 1 \)
- \( 1 + 1 = 10 \)(写 0,进位 1)
- \( 1 + 1 + 1 = 11 \)(写 1,进位 1)
二进制乘法:
二进制乘法甚至更简单,因为你只需要处理 0 或 1。它其实就是一系列的位移 (shifts) 和加法。如果你乘以 1,就直接复制该数字;如果乘以 0,结果当然就是 0。
冷知识:
将二进制数乘以 2,只需在末尾加一个 0 即可!这被称为逻辑左移 (logical shift left)。
3.5.3.3 使用二补数 (Two's Complement) 的有符号二进制
如果我们需要表示负数怎么办?我们使用一种称为二补数 (Two's Complement) 的系统。在这个系统中,最高有效位 (most significant bit)(即最左边的那一位)代表一个负值。
8 位元例子:各个位元的权重不再是 128, 64, 32... 而是变成 -128, 64, 32, 16, 8, 4, 2, 1。
如何将正数转换为负数:
如果觉得有点绕口别担心!只需遵循以下两个简单步骤:
- 反转 (Flip) 所有位元(将 1 变为 0,0 变为 1)。
- 将结果加 1。
二补数的范围:
对于 n 个位元,范围是:\( -2^{n-1} \) 到 \( +2^{n-1} - 1 \)。
以 8 位元为例,范围就是 -128 到 +127。
核心观念:二补数让我们可以通过“加上一个负数”来执行减法。要计算 \( 5 - 3 \),电脑实际上是在计算 \( 5 + (-3) \)。
3.5.3.4 带有小数部分的数值
电脑不仅处理整数,也需要处理小数!这主要有两种方式:
1. 定点数 (Fixed Point)
二进制小数点在数值中处于“固定”位置。例如在一个 8 位元的数值中,我们可能规定 4 位元用于整数部分,4 位元用于小数部分。
类比:想象一个价钱标签,小数点永远在倒数第二位之后(例如 $99.99)。这种方式很简单,但不容易表示极大或极小的数字。
2. 浮点数 (Floating Point)
这类似于科学记数法(例如 \( 6.02 \times 10^{23} \))。它包含两个部分:
- 尾数 (Mantissa):数值本身的有效数字。
- 指数 (Exponent):告诉我们二进制小数点“浮动”到哪里。
在考试中,这两个部分通常都会使用二补数来表示。
关键概念:
- 尾数位元越多 = 精度 (Precision) 越高(小数位越多)。
- 指数位元越多 = 范围 (Range) 越大(可以表示更大或更小的数字)。
3.5.3.9 规范化 (Normalisation)
为了确保我们能从位元中获得最高的精度,我们会对浮点数进行规范化。规范化的数字开头永远是:
- 正数以 01 开头。
- 负数以 10 开头。
这样做可以确保我们不会浪费位元在无意义的前导零(或负数的前导一)上。
3.5.3.5 & 3.5.3.6 二进制运算的误差
电脑运算速度极快,但在数学上并不总是精确的!有些十进制小数(例如 0.1)在二进制中是无法精确表示的。这会导致舍入误差 (rounding errors)。
测量误差:
- 绝对误差 (Absolute Error):真实数值与二进制表示数值之间的实际差值。\( |真实值 - 表示值| \)
- 相对误差 (Relative Error):绝对误差除以真实值。这通常更有用,因为它显示了误差相对于数值本身大小的重要性。
例子:如果你拥有 $10 时掉了 $1,这是一个巨大的误差 (10%)。但如果你拥有 $1,000,000 时掉了 $1,那是一个极小的误差 (0.0001%)。相对误差告诉我们,第二种情况的误差是可以接受的!
3.5.3.7 下溢 (Underflow) 与上溢 (Overflow)
当计算结果超出位元所能承载的极限时,就会发生这种情况。
- 上溢 (Overflow):结果太大,无法放入分配的位元中(就像试图将 1000 塞进只有 3 位的空间)。
- 下溢 (Underflow):结果太小(太接近零),无法精确表示。这常发生在浮点数中,当指数变得过小时。
3.5.3.8 定点数与浮点数的比较
以下是总结,帮助你记住两者的区别:
定点数 (Fixed Point):
- 优点:电脑处理速度较快(数学运算较简单)。
- 缺点:数值范围非常有限。
浮点数 (Floating Point):
- 优点:范围极大(可以表示原子的微小尺寸到星系间的距离)。
- 缺点:处理速度较慢;且容易产生更复杂的精度问题。
总结:若追求速度且数值范围固定(如处理货币),请选择定点数;若需进行复杂的科学计算且涉及极大或极小的数值,请选择浮点数。