二进制算术 - 带溢出的加法

Binary arithmetic - addition with overflow

当我需要减去 2 个数字 (X-Y) 时,我可以取 Y 的 2 的补码并将其加到 X。假设我们的系统使用一个字节(8 位)表示整数。

X = 7 = 00000111
Y = 5 = 00000101

2 的 5 补码

11111010 + 1 = 11111011

加上那 2 =

 00000111
 11111011
__________
100000010 

有结转。如何处理这种结转?

如果我使用 8 位,这意味着我的范围是 -128 到 127。所以 7 和 -5 以及它们的和不会超出该范围。所以这不是溢出。

应该再读一遍我的课本:)

在 2 的补码算法中,进位被丢弃,而 1 的补码算法则将进位带回并添加到结果中。

这个视频帮助我理解了 - https://www.youtube.com/watch?v=lKTsv6iVxV4

这取决于你想做什么

  1. 如果您只是计算 simple/single +/- 操作

    那么通常忽略溢出

  2. 当你需要处理overflow/underflow

    例如如果你出于某种原因需要限制结果(通常是结果范围的安全......)那么如果发生溢出下溢则ALU标记的进位标志.之后,根据输入 sign,magnitude 和操作 (+,-),将结果设置为最大正值或负值。 Aome 平台有自动执行此操作的指令(饱和添加,减去)。

    另一个原因是在这种情况下进行 bigint 操作,将进位添加为 +/-1 到更高的操作(符号取决于操作)......但结果本身保持原样(add,adc,adc,adc,...)

  3. 在现代 languages/platforms 你不再有直接的 ALU 标志寄存器访问权限

    有时您可以利用汇编程序,但在某些情况下它可能比计算本身慢。在那种情况下使用这种方法 32bit ALU in C++ 其中 cy 是进位标志