微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

进行二进制减法时如何检测溢出

如何解决进行二进制减法时如何检测溢出

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

SIGNED 溢出发生在 msbit 的进位和进位不同时。我们在这里看到的。另一种说法是,使用反转操作数B,如果操作数的msbits相同并且结果不相同的值,则它是有符号溢出。

请注意,msbit 的进位是非借位,因此 1 表示没有借位,0 表示有借位。一些处理器架构反转进位并将其称为借位,而其他架构则不这样做。任何一种解决方案都有效,您只需要让比较逻辑匹配以及借用减法即可。

使用小学数学,我们可以继续添加列。如果我们可以简单地向寄存器多加一位,我们就可以获得加减法的完整答案。对于乘法,我们需要两倍的位。对于 3 位操作数,我们需要 6 位结果才能不溢出。为了补充您需要一个 6 位分子作为除法的三位除数,理想情况下。并非所有指令集都提供此功能。是的,对于有符号运算,您需要对扩展进行符号运算,对于无符号运算,您需要补零,因此有符号乘法和无符号乘法之间的区别。对于 3 位结果(乘法),有符号/无符号无关紧要(像小学一样在纸和铅笔上进行,这应该是显而易见的)。同样,对于 3 位加法或减法,无需知道无符号与有符号。

加减法虽然正常的解决方案是加进位加减法借位。 -3 - +3 给出 -6,我们不能用 3 位表示,我们需要 4,但如果我们假设有 3 位寄存器,那么我们唯一能做的就是 6。这意味着我们真的在尝试做 111101 - 000011。>

     1011
   111101
  +111100
    ======
      010

如果我们在视觉上这样做并将其切成两半

     1   011
   111   101
  +111   100
  ============
         010

我们可以使用第二条指令来完成减法(减法)

  1111 
   111 
  +111 
  =====
   111
   

111010 是 -6,没有溢出。关键是让下半部分的进位进入上半部分。

如果架构在减法输出的过程中反转进位位,那么它需要将途中的借位位反转为带借位的减法,否则如果它没有将其反转出 sub 则不要反转它成 sbb.加法和 adc(加进位)的工作方式相同,只是没有反转,进位位作为 msbit 的进位进入 adc。

乘法并不简单,它不是一个位的东西,你需要一个完整的寄存器值,所以一些架构会给你 3 位乘以 3 位等于 6 位有符号和无符号乘法指令。但是对于加法和减法,实际上并不需要,使用进位位和包含其余位的存储器/寄存器的附加指令。您可以根据内存/寄存器的大小进行加减运算,1000 位加 1000 位很容易,它只是一个加法和一组连续的 adc。

,

可以通过(进位到 MSB)XOR(进位出 MSB)来创建溢出标志。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。