我读到只做符号位& 0x7fffffff
屏蔽,不会篡改其他位。
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
但是,此代码输出
0
而不是
2147483648
为什么?
答案 0 :(得分:5)
Java中的负数存储为二进制补码。因此,最小值具有符号位设置而所有其他值未设置。 所以你要做的是:
10000000000000000000000000000000
& 01111111111111111111111111111111
当你清除符号位时,你会得到零。
00000000000000000000000000000000
答案 1 :(得分:1)
删除最重要的位可确保获得非负值。它不能确保结果是积极的。 (0也是非负数。)它也不能确保你得到负值的绝对值。 (你永远不会得到。)
实际上,对于任何负int
值,它都会产生以下值:negative_value - Integer.MIN_VALUE
。
为什么它的行为是这样的,你必须检查两个补码是如何工作的:https://en.wikipedia.org/wiki/Two's_complement