本节书摘来自华章出版社《计算机组成原理》一书中的第2章,第2.3节, 作 者 Computer Organization and Architecture: Themes and Variations[英]艾伦·克莱门茨(Alan Clements) 著,沈 立 王苏峰 肖晓强 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.3 二进制运算
本节将介绍基本的二进制整数算术运算(加法、减法、乘法和除法)。二进制算术运算的规则与十进制基本相同;唯一的区别在于,十进制算术运算以10为基数,每位有10个数字,而二进制运算以2为基数,每位只有2个数字。下面列出了二进制加法、减法和乘法运算的规则,比起对应的十进制运算简单了许多。三个一位二进制数加法的规则也列在了下面,这有助于读者理解进位是如何处理的。
上面的规则描述了两个一位二进制数进行加法、减法和乘法运算时的情形。两个位相加可能产生进位或借位,就像十进制算术运算中那样(例如4+8=2,进位为1)。
真实计算机处理8位、16位、32位或64位的数字,一个字中的所有位都必须参与算术运算。当两个二进制字相加时,一个加数中所有的位都将与另一个加数中对应的位相加,从最低位开始,每次处理一位。加法产生的进位应参与其左边一列中两位的加法。请考虑下面4个8位二进制数相加的例子。请注意,图中加阴影的表示进位(值为1)。
当两个二进制数相减时,一定要记得0–1的差为1,同时会从其左侧借一位。请考虑下面二进制减法的例子(加阴影的表示借位)。请注意例5是用小数减去大数,就像传统的算术运算一样。但我们很快就会看到,计算机并没有按照这种方式工作。
十进制乘法则要难一些——我们必须从1×1=1开始学习九九表,直到9×9=81。二进制乘法仅需要一个简单乘法表,记录了两个位相乘得到一个位的积。
0×0=0
0×1=0
1×0=0
1×1=1
下面的例子描述了011010012(乘数)与010010012(被乘数)相乘的过程。两个n位字相乘将产生一个2n位的积。乘法运算从被乘数的最低位开始,测试它的值是0还是1。如果该位为0,则在算式中写下n个0;如果该位为1,则写下乘数(这个值被称作部分积)。接下来继续测试被乘数左边的下一位并执行同样的操作——这个例子是从上一个部分积的下方、左边一位开始写下n个0或n位的乘数(即部分积被左移了1位)。这个过程将一直继续,直到被乘数中的每一位都按顺序被检测过。最后,这n个部分积被加到一起,生成乘数与被乘数的积。
计算机不会像我们这样完成乘法运算。本章将在后面介绍计算机实现乘法的一些方法。