我的值如下:
int x = -51232;
Java整数为32位,因此在二进制形式中应为:
10000000000000001100100000100000
由于1
为负,因此左侧的符号位设置为x
。
然后我做手术
x = (x & Integer.MAX_VALUE);
Integer.MAX_VALUE
为2147483647
,二进制形式为:
01111111111111111111111111111111
在左侧为0,因为该值为正。
那为什么x & Integer.MAX_VALUE
会产生2147432416
? AND
运算符应仅检索x
和Integer.MAX_VALUE
共有的位,该位应等效于-x
(因为它们不共享相同的符号位)。 / p>
这是怎么回事?
答案 0 :(得分:4)
您的误解是由于缺乏有关Java中如何以二进制表示负整数的知识所致。您应该阅读2的补码。
10000000000000001100100000100000
不是-51232
的二进制表示。
11111111111111110011011111100000
是。
当您按位执行AND时,您将得到:
11111111111111110011011111100000 (-51232)
01111111111111111111111111111111 (Integer.MAX_VALUE)
--------------------------------
01111111111111110011011111100000 (2147432416)
在51232的二进制表示形式旁边是-51232的二进制表示形式。您可以看到它们的总和是2 32 。对于任何一对int
的{{1}}和x
,2的补码都是如此。
-x
答案 1 :(得分:0)
整数存储在两个补码中:https://en.m.wikipedia.org/wiki/Two%27s_complement。
因此,尽管最左边的位表示负数,但它并不是真正的符号位,就像普通表示中的浮点数一样。
这种表示的主要原因是,它使在硬件级别上的加法和减法变得容易。
不应该使用两个补码来表示,-1表示为所有设置为1的位。