1. 加法器最高位的概念

以32位加法器作为例子,
ALU中使用单独1位相加,记录是否进位,逐层传递的方式完成整个32位的加法。
注:ALU:Arithmetic and logical unit 算数逻辑单元

其中每一个用来计算两个数单独1位的运算器叫作:全加器
其数字逻辑图如下所示:
在这里插入图片描述左侧:AB为输入端口,Cin为进位输入端口
右侧:S为输出端口(和),Cout为进位输出端口
其真值表如下图所示:

2.加法器的构成

n-bit加法器由n个上面提到的全加器构成,并进行串联,如下图所示
在这里插入图片描述这是一个4-bit加法器。
在这里插入图片描述这是一个32-bit加法器

3. 关于溢出与进位

溢出的概念:
溢出:overflow,运算结果超出了正常的表示范围
溢出仅针对有符号数的运算

  • 两个正数相加,结果为负数
  • 两个负数相加,结果为正数

从以上概念可以得到3个问题:

  1. 无符号数不存在溢出的概念,为什么?
  2. (有符号数)正数相加的进位与溢出有什么关系?
  3. 对于为什么两个负数相加的进位不会产生溢出?负数的进位与溢出有什么关系?

问题1:无符号数不存在溢出

无符号数的最高位不是符号位,因此当两个无符号数最高位产生进位时,也会导致我们得不到原本想要得到的结果,但是这个结果是取模之后的

例如:
(十进制)8 + 12 = 20
(二进制)1000 + 1100 = 1 0100
按照4位加法器设计,这里最高位Cout = 1,剩下的4位结果为:0100 = (十进制)4,对应20 % 16 的结果。

问题2:(有符号数)正数相加的溢出与进位的关系

正数是有符号数,因此最高位为符号位 = 0;
首先说溢出:
例如:0100 + 0100 = 1000 (对应有符号数 4 + 4 = -8)
这就是溢出:两个正数相加得到了一个负数

那有没有两个正数相加得到了一个正数,但是却发生数值错误的例子呢?
无,因为正数的符号位为0,就算后面的位再怎么进位也不可能使得前面符号位变为1之后再发生进位,这就好比:十进制中两位数的最大值为 99 + 99 不可能变成一个首位为2的三位 数是一样的。

因此对于2个正数相加而言(有符号数),不存在进位的概念,最多只会发生溢出。

问题3:两负数相加的进位与溢出

负数是有符号数,最高位为1
溢出如下(实质上下面两种是一种情况,见最后的真值表):
1000 + 1000 = 1 0000 ( -8 + -8 = 0)
1100 + 1000 = 1 0100 (-4 + -8 = 4)
进位的情况如下:
1100 + 1100 = 1 1000(-4 + -4 = -8)

总结

经过上面的简单分析,发现其实情况还是很多的,会不会有遗漏呢,使用真值表可以完美解决这个问题,同时得出结论使用一个异或器就可以完成对于加法器中的溢出判断
真值表如下所示:
在这里插入图片描述
标注出的两种情况会发生溢出,相应已经在上面的3个问题中举出了例子。

使用如下的电路完成对于溢出的判断
在这里插入图片描述
当输出为1时(即两者不相等,异或之后结果为1),即为溢出。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐