将decimal转换为signed binary

时间:2011-01-18 03:49:23

标签: binary

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

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

所以128 = 10000000

所以“逆”是01111111

所以和“01111111”+“1”=“10000000”这是“-0”不是吗?

我的教科书让这看起来很容易,但我无法弄清楚我做错了什么。谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

不,这绝对是-128(无论如何都是两个补码,这就是你所说的否定数字)。对于负数的符号/幅度表示,它只有-0

请参阅this answer以获取有关两个表示的详细信息以及C允许的第三个表示,一个补码,但我会从那里复制一个片段以使此答案尽可能自包含。


要获得正数的否定表示,您:

  • 反转所有位,然后添加一个用于二进制补码。
  • 将所有位反转为一个补码。
  • 仅反转符号/符号的符号位。

您可以在下表中看到:

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

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

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

答案 1 :(得分:1)

这取决于你的二进制表示是什么 - 补码,二进制补码,符号幅度或其他东西。 “反转位和加1”对于二进制补码是正确的,这是目前大多数计算机内部用于签名数字的内容。在您的示例中,“10000000”是-128的8位二进制补码表示,这是您想要的。两个补充中没有-0这样的东西。

对于符号幅度,您可以通过翻转符号位来否定。对于补码,你可以通过反转所有位来否定。