关于ALU中加法器最高位的溢出检测(进位输入与进位输出的异或)

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),即为溢出。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值