【问题标题】:Binary arithmetic - addition with overflow二进制算术 - 带溢出的加法
【发布时间】:2015-09-25 19:20:50
【问题描述】:

当我需要减去 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 以及它们的总和不会超出该范围。所以这不是溢出。

【问题讨论】:

    标签: math binary addition


    【解决方案1】:

    这取决于你想要做什么

    1. 如果您只是计算简单/单一的+/- 操作

      那么溢出通常会被忽略

    2. 当您需要处理上溢/下溢时

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

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

    3. 在现代语言/平台上,您不再具有直接 ALU 标志寄存器访问权限

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

    【讨论】:

      【解决方案2】:

      应该再读一遍我的教科书:)

      在 2 的补码算术中,结转被丢弃,而在 1 的补码算术中,结转被带回并添加到结果中。

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

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-31
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多