【问题标题】:signed two's complement arithmetic有符号补码算术
【发布时间】:2011-06-23 21:23:01
【问题描述】:

我在考虑数据类型范围时,出现了一个问题。 我们知道有符号字符的范围是 -128 到 127。 我知道 127 是怎么来的,即 0111111 = +127

但我不明白 -128 是怎么来的? 如果我们只是打开符号位,我们得到 11111111,它是如何等于 -128 的?

【问题讨论】:

    标签: c types


    【解决方案1】:

    大多数时候,计算机使用所谓的2的补码来表示有符号整数。

    2 的补码的工作方式是,可能的值处于一个巨大的循环中,从 0 到 MAX_VALUE,到 MIN_VALUE,再到零等等。

    所以最小值是最大值+1 - 01111111 = 127,和10000000 = -128

    这具有与无符号运算完全相同的良好特性 - 如果我想做-2 + 1,我有11111110 + 00000001 = 11111111 = -1,使用与无符号加法相同的硬件。

    低端有额外值的原因是我们选择将所有高位设置为负数,这意味着 0 会从正数一侧取走一个值。

    【讨论】:

    • 值得指出的是 is 表示11111111 是最小可表示数字,它确实是-127 - 这是“符号幅度”形式。在符号大小中,有两个零 - 分别是 +0-00000000010000000
    • @Asad Hanif,您需要更多帮助吗?如果此或其他答案对您有帮助并回答了您的问题,请不要忘记接受该答案。另见What does it mean when an answer is "accepted"? 和Why is voting important?
    【解决方案2】:

    two's complement 中,-128 是 10000000。

    【讨论】:

      【解决方案3】:

      负数的符号位设置为 1; -128 是设置了符号位但没有其他位的值(即,它是最小的负数)。 -128 的二进制表示是 10000000。对于其他数据长度,二进制补码中最小的负数始终为1000...,以表示正确的零数。

      【讨论】:

        【解决方案4】:

        一种简单的思考方法是从 01111111 开始,然后不断减 1 直到它回绕;前一个值是最小的负值。使用标准“借用”技术从 00000000 中减去 1 得到 11111111,这确实是 -1 的二进制表示。我们可以继续减到 10000000,即 -128,再减去 1 得到 01111111,循环往复。

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 1970-01-01
          • 2015-11-28
          • 1970-01-01
          • 2015-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-27
          相关资源
          最近更新 更多