【问题标题】:converting decimal to signed binary将十进制转换为有符号二进制
【发布时间】:2011-01-18 03:49:23
【问题描述】:

假设我想将“-128”转换为二进制。

据我了解,我得到“128”的二进制表示,反转位,然后加 1。

所以 128 = 10000000

所以“逆”是 01111111

那么“01111111”+“1”=“10000000”是“-0”不是吗?

我的教科书让这看起来很简单,但我不知道我做错了什么。感谢您的帮助。

【问题讨论】:

    标签: binary


    【解决方案1】:

    不,那绝对是-128(无论如何都是二进制补码,鉴于您对否定数字的描述,这就是您所说的)。只有-0 用于负数的符号/大小表示。

    请参阅this answer 了解有关这两种表示形式以及 C 允许的第三种表示形式的详细信息,即一个补码,但我将从那里复制一个 sn-p 以使此答案尽可能独立。


    要获得正数的负表示,您:

    • 反转所有位,然后将 1 加到二进制补码中。
    • 将所有位反转为一个补码。
    • 仅反转符号/大小的符号位。

    您可以在下表中看到这一点:

    number | twos complement     | ones complement     | sign/magnitude
    =======|=====================|=====================|====================
         5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101
        -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101
    

    你应该知道8位二进制补码中没有128,最大值是127。

    数字超过中点的地方就是“聪明”的事情发生的地方:

    00000000 ->    0
    00000001 ->    1
    : :
    01111110 ->  126
    01111111 ->  127
    10000000 -> -128
    10000001 -> -127
    : :
    11111110 ->   -2
    11111111 ->   -1
    

    因为添加(例如)100-1 的位模式和 8 位环绕将自动神奇地为您提供 99

    100+  0 0110 0100
      1-  0 1111 1111
          ===========
          1 0110 0011  99+ (without that leading 1)
    

    【讨论】:

      【解决方案2】:

      这取决于你的二进制表示是什么——一个补码、二进制补码、符号幅度或其他东西。 “反转位并加 1”对于二进制补码是正确的,这是当今大多数计算机在内部用于有符号数的方法。在您的示例中,“10000000”是 -128 的 8 位二进制补码表示,这就是您想要的。二进制补码中没有 -0 这样的东西。

      对于符号幅度,您可以通过翻转符号位来取反。对于一个补码,您可以通过反转所有位来取反。

      【讨论】:

        猜你喜欢
        • 2014-06-20
        • 1970-01-01
        • 2014-12-04
        • 2014-05-21
        • 2021-04-18
        • 2021-07-02
        • 2011-09-03
        • 2012-06-26
        • 1970-01-01
        相关资源
        最近更新 更多