将十进制转换为有符号二进制

5
假设我想将“-128”转换为二进制。
据我所知,我要获得“128”的二进制表示形式,然后反转位并添加1。
所以128=10000000
因此,“反向”是01111111
因此,“01111111”+“1”=“10000000”,这不是“-0”吗?
我的教科书使这看起来很容易,但我弄不明白我做错了什么。谢谢您的帮助。
2个回答

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

因为将(例如)100-1 的位模式相加,并使用8位环绕,将自动地给出99
100+  0 0110 0100
  1-  0 1111 1111
      ===========
      1 0110 0011  99+ (without that leading 1)

1

这取决于您的二进制表示方式——补码、反码、原码或其他。对于补码,"反转位并加1"是正确的,这是大多数计算机内部用于有符号数字的表示方式。在您的示例中,"10000000"是-128的8位补码表示,这正是您想要的。在补码中不存在-0。

对于原码,您可以通过翻转符号位来进行取反。对于反码,您可以通过反转所有位来进行取反。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接