我看到过这样的说法:执行 & 0x7fffffff
只会屏蔽符号位,不会影响其他位。
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
但是,这段代码输出的是:
0
替代
2147483648
为什么会这样呢?
我看到过这样的说法:执行 & 0x7fffffff
只会屏蔽符号位,不会影响其他位。
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
0
替代
2147483648
10000000000000000000000000000000
& 01111111111111111111111111111111
00000000000000000000000000000000
来源:https://en.wikipedia.org/wiki/Two%27s_complement
二进制补码是一种用于表示有符号整数的方法。它被广泛应用于计算机科学中。在二进制补码中,最高有效位(MSB)代表符号(0表示正数,1表示负数),其余位表示绝对值的二进制形式。这种方法可以将加法和减法统一为同一操作。例如,在8位补码中,127表示为01111111,而-128表示为10000000。
int a = -25; System.out.println(a & 0x7fffffff);
输出 2147483623
。难道不应该输出 25
吗? - user3824413将最高有效位删除可以确保您获得非负值。但这并不保证结果是正数。(0 也是非负的。)它也不能确保您获得负值的绝对值。(你永远不会得到。)
实际上,对于任何负的 int
值,它将产生以下值:negative_value - Integer.MIN_VALUE
。
要了解为什么它会像这样运行的原因,您必须检查两个补码的工作方式:https://en.wikipedia.org/wiki/Two's_complement
a
。 - Rustam-a
。 - Codebender~a
的二进制补码,你会得到你想要的。 - Rustama
是负数,所以屏蔽符号位应该是-a
。如果我错了,请纠正我。 - user3824413Integer.toBinaryString(a)
函数。这将有助于您理解。 - Codebender