在整数的二进制补码表示中,(2 ^ 32-1)的计算结果与-1相同?

问题描述 投票:0回答:3

这是我到目前为止完成的工作:

2 ^ 32 = 10 ... 0

减1-> 01 ... 1这样就可以得到32 1's

1 = 01

翻转位-> 11 .... 10加1-> 1 ... 1这样就可以得到32 1's

我想念什么吗?我问是因为我尝试了一种练习problem,在该练习中,您必须翻转数字的所有二进制位。与-1进行异或运算不起作用,但与2 ^ 32-1进行异或运算则无效。

java binary twos-complement number-systems
3个回答
0
投票

32位2的补码只能表示-(2 ^ 31)..(2 ^ 31)-1(含)范围内的值。由于2 ^ 32-1不在该范围内,因此可以推断出您使用的任何位模式实际上对应于does

的值。

0
投票

让我们将一个整数的32位数字从0到31进行编号。数字#0代表2⁰,数字#1代表2¹,依此类推。更一般地,数字#n代表2ⁿ。

但是我们最多只能有#31位数字:我们有32位数字,但是我们从0开始计数。没有32位数字可创建2³²。

那么计算机做什么?它基本上是假装您写了2³²,但是删除了除前32位(0-31位)之外的所有数字。这称为integer overflow。这意味着2³²,“应该”为1,后跟32 0,实际上只是32 0-当然等于0。从中减去1,得到-1。

[如果您使用long(不是整数),那么您可以使用64位而不是32位。在这种情况下,在32位不会发生溢出,您会发现2³²-1不会t等于-1:就像您期望的那样,它等于4294967295。但是在这种情况下,出于类似原因,2⁶⁴为0。


0
投票

要以2的补码形式创建任意数字,请翻转这些位并加1。

因此,-1为以下

1 = 00000000000000000000000000000001
flip those bits
       11111111111111111111111111111110
add 1 to it and you get
       11111111111111111111111111111111

现在为什么是-1?

Well -1 +1 = 0。

如果一起添加以下内容,则会得到

       11111111111111111111111111111111
      +00000000000000000000000000000001

您继续向左移动到下一个位置,最终使该字段溢出,剩下0。

       00000000000000000000000000000000
© www.soinside.com 2019 - 2024. All rights reserved.