【发布时间】:2012-03-26 22:45:32
【问题描述】:
为什么当我位移1 时Java返回-2147483648?
预期结果是9 223 372 036 854 775 808,用 Wolfram Alpha 和我的计算器测试。
我测试过:
System.out.print((long)(1 << (63)));
【问题讨论】:
标签: java bit-manipulation bit-shift
为什么当我位移1 时Java返回-2147483648?
预期结果是9 223 372 036 854 775 808,用 Wolfram Alpha 和我的计算器测试。
我测试过:
System.out.print((long)(1 << (63)));
【问题讨论】:
标签: java bit-manipulation bit-shift
关于这条线有一件重要的事情需要注意
System.out.print((long)(1 << (63)));
你先取(1 << 63),然后然后你投长。结果,您实际上是在整数中左移,因此长转换没有任何效果。这就是为什么左移 63 位给出最小整数而不是最小长度的原因。
但还有一点更重要。 Java long 总是有符号的,所以即使是行
System.out.print(1L << 63);
会给出一个负数。在二进制补码下,只要最左边的位为 1,则该数字为负数。
您实际上不能在 Java 原始类型中表示数字 263 = 9223372036854775808,因为该数字大于最大 long,而 long 是最大的原始类型。不过,您可以将此号码表示为BigInteger。您甚至可以使用代码通过左移 63 来生成它
BigInteger.ONE.shiftLeft(63)
【讨论】:
你有一个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 - 它不会改变它的值。
【讨论】: