这个问题看起来可能是重复的,但事实上并不是。我想知道如何将一个负数(十进制)转换为32位数字(二进制)。例如,在基数-10中,-9相当于基数-2中的11111111111111111111111111110111 。请详细解释一下操作过程。谢谢。
这个问题看起来可能是重复的,但事实上并不是。我想知道如何将一个负数(十进制)转换为32位数字(二进制)。例如,在基数-10中,-9相当于基数-2中的11111111111111111111111111110111 。请详细解释一下操作过程。谢谢。
11111111111111111111111111111111
实际上代表-1.原因是,如果您将1添加到此处,进位将全部进行,将每个1替换为0,并且最后一次进位将从末尾掉落,类似于三位数计数器中的999,如果增加则返回000。结果是
00000000000000000000000000000000
通常情况下,它代表零。这就是在二进制补码表示法中如何使 -1 + 1 = 0
。
现在,如果您拿一个32位数字 n
,例如:
00010111000010101100100011110010
对其进行按位补码运算即可得到~n
,也就是将每个1替换为0,每个0替换为1。
11101000111101010011011100001101
然后将它们相加,得到n + ~n
。
00010111000010101100100011110010
11101000111101010011011100001101 +
--------------------------------
11111111111111111111111111111111
没有进位发生,你得到了一个全是1的比特模式,即 -1 = n + ~n
,因此 -n = ~n + 1
。
这就是二进制补码表示法的关键事实:-n = ~n + 1
。
现在你可以非常简单地解决问题。你知道如何将正数转换,这使你能够对其取反。
那么 -9 是多少?
首先像往常一样将9转换为二进制:1001,前面有很多前导零。 然后对其取反,再加1,就得到了-9。以下是事件的顺序。
n : 00000000000000000000000000001001
//complement
~n : 11111111111111111111111111110110
//add 1
-n : 11111111111111111111111111110111