如何在执行二进制减法时检测溢出 [英] How is overflow detected when doing binary subtraction
本文介绍了如何在执行二进制减法时检测溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我们有3个比特可以玩。我将在2的补码中表示正负3:
+3 = 0b011
-3 = 0b101
执行加法时,当溢出发生时,您总是会遇到一个悬浮位(-3) + (+3)
:
1 0 1
+ 0 1 1
-----
1 0 0 0
但是减法(-3) - (+3)
呢?
1 0 1
- 0 1 1
-----
0 1 0
0b010
为2
,这不是我们预期为-6
的正确结果。有一个溢出物
而且额外的位甚至没有生成,因此如何检测到存在溢出?
我想解决这个问题的正确方法是先用符号扩展输入?
推荐答案
如何在逻辑中检测签名溢出
(-3) - (+3) = (-3) + (-3) = (-3) + (~3) + 1
使用小学数学和二进制补码
1
101
+ 100
======
完成
1011
101
+ 100
======
010
当MSBIT的进位进位和进位出位不同时,就会发生带符号溢出。这是我们在这里看到的。另一种说法是,使用反转操作数B,如果操作数的msbit相同,并且结果不是相同的值,则它是带符号溢出。
请注意,msbit的进位是不借入,因此1表示没有借入,0表示有借入。一些处理器体系结构反转进位并将其称为借入位,其他处理器体系结构则不这样做。无论哪种解决方案都有效,您只需使您的比较逻辑匹配,并用Borrow进行减法。使用小学数学,我们可以继续添加列。如果我们能简单地向一个寄存器再加一位,我们就可以得到加法和减法的完整答案。对于乘法,我们需要两倍的位数。对于3位操作数,我们需要6位结果才不会溢出。为了补充这一点,理想情况下,您需要一个6位分子作为除法的三位除数。并不是所有的指令集都提供此功能。是的,对于有符号的运算,你需要符号扩展,而对于无符号的运算,你需要补零,这就是有符号乘法和无符号乘法的区别。对于3位结果(乘法),有符号/无符号并不重要(像小学一样在纸上和铅笔上做,这应该是显而易见的)。同样,使用3位加法或减法时,不需要知道无符号对有符号。
使用加法和减法,尽管通常的解是用进位加和借入减。-3-+3给出了我们不能用3位表示的-6,我们需要4,但如果我们假设3位寄存器,那么我们唯一能做的就是6。这意味着我们实际上正在尝试做111101-000011。
1011
111101
+111100
======
010
如果我们在视觉上这样做并将其切成两半
1 011
111 101
+111 100
============
010
我们可以使用第二条指令(借入减法)来完成减法
1111
111
+111
=====
111
111010为-6,无溢出。关键是让下半部分的进位进入上半部分的进位。
如果体系结构在移出减法时反转进位位,则它需要在移出减法时将借入位反转到带有借入的减法中,否则,如果它不将其反转出SUB,则不要将其反转到SBB。ADD和ADC(带进位加法)的工作方式相同,只是没有反转,进位位作为msbit的进位进入ADC。乘法不是那么简单,它不是单个位的事情,您需要整个寄存器位的值,所以一些体系结构会给您3位乘以3位等于6位有符号和无符号乘法指令。但对于加法和减法,没有实际需要,可使用进位位和包含其余位的存储器/寄存器的附加指令。您可以根据内存/寄存器的宽度进行加/减,1000位加1000位很容易,只需一次加法和一串ADC即可。这篇关于如何在执行二进制减法时检测溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文