Pie*_*ard 6 java bit-manipulation bit-shift
当我移位1 << 63时,为什么Java返回-2147483648?
预期的结果是9 223 372 036 854 775 808使用Wolfram Alpha和我的计算器进行测试.
我测试过:
System.out.print((long)(1 << (63)));
Run Code Online (Sandbox Code Playgroud)
Ada*_*cin 27
有关这条线的重要事项需要注意
System.out.print((long)(1 << (63)));
Run Code Online (Sandbox Code Playgroud)
你先拿(1 << 63),然后再施展.结果,你实际上是左移整数,所以长演员没有任何影响.这就是为什么向左移63位给出最小整数而不是最小长度的原因.
但还有另一个更重要的观点.Java longs总是签名,所以即使是行
System.out.print(1L << 63);
Run Code Online (Sandbox Code Playgroud)
会给出一个负数.在二进制补码下,每当最左边的位为1时,数字为负数.
实际上,您无法在Java基元类型中表示数字2 63 = 9223372036854775808,因为该数字大于最大长度,并且long是最大的基本类型.但是,您可以将此数字表示为BigInteger.您甚至可以使用代码通过左移63来生成它
BigInteger.ONE.shiftLeft(63)
Run Code Online (Sandbox Code Playgroud)
你有一个整数溢出 [两次].
1 << 32 == 1
1 << 31 == -2147483648 [ becuase this is the binary representation in 2's complement for -2147483648]
1 << 63 == 1 << (32 + 31) == (1 << 32) << 31 == 1 << 31 == -2147483648
Run Code Online (Sandbox Code Playgroud)
当你这样做时,(long)(1 << (63))你只是将1 << (63)[是-2147483648] 的结果转换为long- 并且它不会改变它的值.
| 归档时间: |
|
| 查看次数: |
7370 次 |
| 最近记录: |