【问题标题】:The two's complement of the most negative number最负数的补码
【发布时间】:2021-02-07 19:19:52
【问题描述】:

我的疑问是如何处理二进制补码表示中的最负数。为了简单起见,我将用 1 字节表示来描述问题。最正数是

01111111

十进制为 127。它的二进制补码很容易计算。只是反转我们得到的位

10000000

然后添加单位

10000001

十进制为-127。 零数具有特定的行为,因为它是其自身的二进制补码,这是众所周知的。然而,当我看到最负数也是二的补码时,我遇到了困难。最负值是-128,即 10000000 补码是 01111111 如果我们添加我们得到的单位 10000000 这当然是一个错误的结果。我的问题是这个数字是从未使用过还是从未达到过

【问题讨论】:

    标签: binary


    【解决方案1】:

    它被使用,但在某种意义上它是“最奇怪的数字”。有时选择不使用它,或者保留它以指示错误情况。这些只是有时使用的约定,没有什么本质上阻止正常使用最负整数。在很多情况下,一个数不会被否定,然后这个特殊属性就不会出现。

    二进制补码整数的这种奇怪性质意味着,在某些习惯上取绝对值并用非负数计算的场景中,取而代之的是取负绝对值(它否定正输入,而不是负输入)并用非正数计算。这很有帮助,因为正常的绝对值具有最负整数没有正对应物的怪癖,但正数没有这样的怪癖,因此它们都可以安全地被否定。这个技巧并不总是适用的。

    -128 否定自己并不总是错误的事情发生。尽管结果看似不正确,但(使用加法的标准定义)x + (-x) = 0 仍然适用于 所有值,包括 -128,因此它在代数上是明智的。它还至少在某种程度上与取绝对值进行了合理的交互:虽然abs(x) 确实可以通过这种方式产生负结果(这通常是不可取的),但将结果重新解释为相同大小的无符号数会使结果正确, (unsigned 8 bit)abs(-128) = 128.

    最负整数在位操作代码中使用相对频繁。它的算术属性在那里不太重要,使数字“不那么奇怪”。

    【讨论】:

    • 感谢哈罗德的回复。本质上我想确认这个数字确实有一个奇怪的特征。
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2019-02-20
    • 2023-03-25
    相关资源
    最近更新 更多