为什么当我移位 1<<<<<<<<<<<<<<<<<< 63 ?
预期结果是9 223 372 036 854 775 808
,使用Wolfram Alpha和我的计算器测试。
我测试过:
System.out.print((long)(1 << (63)));
答案 0 :(得分:27)
有关行
的重要事项System.out.print((long)(1 << (63)));
您首先选择(1 << 63)
,然后然后投出很长时间。结果,你实际上是左移整数,所以长演员没有任何影响。这就是为什么向左移63位给出最小整数而不是最小长度。
但还有另一个更重要的观点。 Java longs总是签名,所以即使是行
System.out.print(1L << 63);
会给出一个负数。在二进制补码下,每当最左边的位为1时,该数字为负数。
实际上,您无法在Java基元类型中表示数字2 63 = 9223372036854775808,因为该数字大于最大长度,long
是最大的基本类型。但是,您可以将此数字表示为BigInteger。您甚至可以使用代码
BigInteger.ONE.shiftLeft(63)
答案 1 :(得分:6)
您正在integer overflow [两次]。
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
执行(long)(1 << (63))
时,您只会将1 << (63)
[-2147483648
]的结果投射到long
- 并且不会更改其值。