二进制(binary)加法要从右边开始逐列相加,写下一个数字,列的和达到 2 或更多时进位。如果固定位数的数最左边那一列还产生了进位,结果就**溢出(overflow)**了:它需要的位数比可用的多。
这一课用到你已经会的二进制位值,并与位深度相连,后者解释为什么固定位数有上限。
加法规则是什么?
| 列的和 | 写 | 进位 |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 0 |
| 2(1 + 1) | 0 | 1 |
| 3(1 + 1 + 进位 1) | 1 | 1 |
每一列要加上两个位和右边那一列送来的进位。进位是最容易忘记的,所以在数字上方用一小行写出来。
没有溢出的示范例子
计算 01101011 加 00111001(8 位)。
先转换,方便之后检查:01101011 = 64 + 32 + 8 + 2 + 1 = 107,00111001 = 32 + 16 + 8 + 1 = 57。预期的和是 164。
现在从右边开始加(第 0 列是最右边那一列):
| 列 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 进位(进入) | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
| 第一个数 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
| 第二个数 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 |
| 结果 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
第 0 列:1 + 1 = 10,写 0 进 1。第 1 列:1 + 0 + 1 = 10,写 0 进 1。第 2 列:0 + 0 + 1 = 1。
第 3 列:1 + 1 = 10,写 0 进 1。第 4 列:0 + 1 + 1 = 10,写 0 进 1。第 5 列:1 + 1 + 1 = 11,写 1 进 1。
第 6 列:1 + 0 + 1 = 10,写 0 进 1。第 7 列:0 + 0 + 1 = 1,没有向外进位。
结果是 10100100。检查:128 + 32 + 4 = 164,吻合。第 7 列没有向外进位,所以没有溢出。
有溢出的示范例子
计算 11001000 加 01000110(8 位)。十进制是 200 + 70 = 270,超过 255,所以预期会溢出。
| 列 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 进位(进入) | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 第一个数 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| 第二个数 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
| 结果 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
第 6 列:1 + 1 = 10,写 0 进 1。第 7 列:1 + 0 + 1 = 10,写 0,并且从最左边那一列向外进 1。
8 位寄存器只保留 00001110,也就是 14。真正的答案需要九位:1 00001110 = 256 + 14 = 270。因此正确的说法是:结果溢出,因为 270 对 8 位来说太大(最大 255),存储的值 14 是错的。
要留意的错误
常见的失误是写下了数字,却忘记进位。
题目: 计算 00000111 加 00000001。
错误做法: 第 0 列:1 + 1 = 0,但没有写进位,于是第 1 列和第 2 列直接照抄。答案写成 00000110。
这个答案是 6,但 7 + 1 必须是 8。纠正方法是先写出进位那一行,用到一个进位就划掉一个。
第 0 列得 0 进 1,第 1 列 1 + 0 + 1 = 0 进 1,第 2 列 1 + 0 + 1 = 0 进 1,第 3 列 0 + 0 + 1 = 1。正确答案是 00001000。如果转回十进制发现数值不对,就是丢了一个进位。
自我检查
1. 计算 00011011 加 00000101。
查看答案
27 + 5 = 32。逐列做:进位从第 0 列一直传到第 4 列,结果是 00100000。检查:32。
2. 计算 10000001 加 10000001。会溢出吗?
查看答案
129 + 129 = 258,超过 255。第 0 列:1 + 1 = 0 进 1。第 7 列:1 + 1 = 0 向外进 1。存储的结果是 00000010,并带有向外的进位,所以会溢出。存储的 2 是错的,因为真正的答案是 258。
3. 180 + 76 在 8 位中会溢出吗?
查看答案
180 + 76 = 256,比最大值 255 多 1。会溢出:存储的 8 位会是 00000000。
接下来学什么
接着学解释字符编码,再学位深度,它解释了溢出背后的上限。所有内容都可以在综合练习里练习。
不少学生加法没错,却不会用文字解释溢出来拿分。老师可以在线上一对一 Computer Science 补习中和你一起练这样的表达。