亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 工业技术

二进制溢出

有符号二进制数的一个警告是溢出,其中加法或减法问题的答案超出了可以用分配的位数表示的幅度。记住符号位的位置从问题开始就固定了。

对于最后一个示例问题,我们使用五个二进制位来表示数字的大小,最左边(第六个)位作为负权重或符号位。用五位来表示幅度,我们的表示范围是 2 5 , 或从 0 到最大值的三十二个整数步长。

这意味着我们可以表示高达 +3110 (0111112) 或低至 -3210 (1000002) 的数字。

六位数字字段的限制

如果我们用两个二进制数设置一个加法问题,第六位用作符号,结果要么超过+3110,要么小于-3210,我们的答案将是错误的。让我们尝试将 1710 和 1910 相加,看看这个溢出条件如何处理过多的正数:

答案 (1001002),用第六位解释为 -3210 位,实际上等于 -2810,而不是 +1710 和 +1910 加在一起应该得到的 +3610!显然,这是不正确的。出了什么问题?

答案在于我们工作的六位数字字段的限制 由于真和真和 (3610) 的大小超过了我们指定的位字段的允许限制,我们有一个溢出错误 .

简单地说,六位没有给出足够的位来表示正确的和,所以我们使用丢弃最左边“进位”位的策略获得的任何数字都是不正确的。

如果我们将两个负数相加产生的和对于我们的六位二进制字段来说太小,则会发生类似的错误。让我们尝试将 -1710 和 -1910 相加,看看这是如何工作的(或不工作,视情况而定!):

(不正确的)答案是肯定 二十八。负17和负19的实和太小而无法用5位幅度字段和第6个符号位正确表示这一事实是造成这种困难的根本原因。

使用第七位作为符号位

再试试这两个问题,只不过这次用第七位作为符号位,允许用6位来表示大小:

通过使用足够大的位域来处理和的大小,我们得到了正确的答案。在这些示例问题中,我们已经能够通过以十进制形式执行加法问题并将结果与​​二进制答案进行比较来检测溢出错误。

例如,当将 +1710 和 +1910 加在一起时,我们知道答案是假设 是 +3610,所以当二进制和检查出来是 -2810 时,我们知道一定有问题。虽然这是一种检测溢出的有效方法,但效率不高。

毕竟,互补的整个想法是能够可靠地将二进制数相加,而不必通过将相同的数以十进制形式相加来仔细检查结果!对于构建电子电路以将二进制量相加的目的尤其如此:电路必须能够在没有已经知道正确答案的人的监督下检查自己是否溢出。

我们需要的是一种简单的错误检测方法,不需要任何额外的算法。也许最优雅的解决方案是检查符号 总和并将其与相加数字的符号进行比较。

显然,两个正数相加应该是正数,两个负数相加应该是负数。请注意,每当我们在示例问题中遇到溢出条件时,总和的符号总是相反 两个相加的数字:+1710加+1910得到-2810,或-1710加-1910得到+2810。

仅通过检查标志,我们就可以判断出问题了。但是对于正数与负数相加的情况呢?总和应该是什么符号才能正确。或者,更准确地说,sum 的什么符号必然表示溢出错误?

这个问题的答案同样优雅:永远 当两个相反符号的数字相加时会出现溢出错误!当考虑溢出的性质时,其原因是显而易见的。当一个数的大小超过位域大小允许的范围时,就会发生溢出。

两个同号数字之和很可能超出这两个数字的位域范围,因此在这种情况下可能会发生溢出。但是,如果将一个正数与一个负数相加,则总和将始终比两个相加数中的任何一个更接近于零:其大小 must 小于任一原始数的大小,因此不可能溢出。

幸运的是,这种溢出检测技术在电子电路中很容易实现,它是数字加法器电路的标准特性:稍后章节的主题。

相关工作表:


工业技术

  1. 电子科学
  2. 设置家庭实验室
  3. 电压表使用
  4. 3 位二进制计数器
  5. 十进制数与二进制数
  6. 八进制和十六进制数
  7. 二进制加法
  8. 负二进制数
  9. 二元减法
  10. 什么是溢流管?
  11. 在 x86 上为 arm 构建容器
  12. 在 PLCnext 上开始使用 Go