基本思路:想一种办法使得三排开关连起来
-
全加器
注意:最左边的全加器的进位输出信息的本质是表示计算结果是否溢出;
两个个位相加
输入信息:
- 被加数
- 加数
输出信息
- 进位信息
- 和信息
实现:
异或门实现和运算;
与门实现进位运算;
将一个异或门和与门电路并联封装一起来,就是一个半加器
两位相加
输入信息
- 被加数
- 加数
- 来自个位的进位信息
输出信息
- 和信息
- 进位信息
实现:
两个半加器和一个或门电路=全加器
第一个半加器的输入是被加数和加数,输出是和S1,进位信息C1;
第二个半加器的输入是个位的进位信息C0,及上一步的计算结果R1,输出是和S2,进位信息C2;
或门电路的输入是第二个半加器的进位信息C2,和第一个半加器的进位信息C1,输出是进位信息C3;
思考题
这一讲,详细讲解了无符号数的加法器是怎么通过电路搭建出来的。那么,如果是使用补码表示的有符号数,这个加法器是否可以实现正数加负数这样的运算呢?如果不行,我们应该怎么搭建对应的电路呢?
答:使用全加器可以实现使用补码表示的有符号数,但需要对文中的加法器电路进行优化。
根据正数加负数转换成正数加上这个负数的补码,将减法运算转化成加法运算,比如A-B=A+(-B)=A+(~B+1),即:如果发现是做减法,则就将B作为一个非门的输入,且给设置低位的进位输入为1,即可;
如何检测溢出?
首先,列举下两个有符号数相加产生溢出的条件:
- 正数+正数
如果结果为负数,则产生了溢出; - 负数+负数
如果结果为正数,则产生了溢出; - 正数-负数
如果结果为负数,则产生了溢出; - 负数-正数
如果结果为正数,则产生了溢出;
其次,可以根据最高数值位是否产生进位,以及符号位是否产生进位来判断是否有溢出发生,即如果最高位的进位输入和最高位的进位输出不相等的话,就表示发生了溢出。对应的电路实现是使用最高位的进位输出和进位输出作为一个异或门的输入即可,如果异或门的输出是1,就表示发生了溢;如果该异或门的输出是0,表示没有溢出。
对应上面的四种情况就是:
- 正数+正数有溢出,即最高数值位产生了进位,而符号位没有进位;
- 负数+负数有溢出,即最高数值位没有产生进位,而符号位产生了进位;
- 正数-负数有溢出,即最高数值位产生了进位,而符号位没有进位;
- 负数-正数有溢出,即最高数值位没有产生进位,而符号位产生了进位;