如何在执行二进制减法时检测溢出 [英] How is overflow detected when doing binary subtraction

查看:8
本文介绍了如何在执行二进制减法时检测溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有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

0b0102,这不是我们预期为-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆