![](/img/trans.png)
[英]Why does right shift (>>) bit operation over byte give strange result?
[英]bit shift operation does not return expected result
當我移位1 << 63時,為什么Java返回-2147483648 ?
預期結果為9 223 372 036 854 775 808
,使用Wolfram Alpha和我的計算器進行測試。
我測試過:
System.out.print((long)(1 << (63)));
有關這條線的重要事項需要注意
System.out.print((long)(1 << (63)));
你先取(1 << 63)
, 然后再施展。 結果,你實際上是左移整數,所以長演員沒有任何影響。 這就是為什么向左移63位給出最小整數而不是最小長度的原因。
但還有另一個更重要的觀點。 Java longs總是簽名,所以即使是行
System.out.print(1L << 63);
會給出一個負數。 在二進制補碼下,每當最左邊的位為1時,數字為負數。
實際上,您無法在Java基元類型中表示數字2 63 = 9223372036854775808,因為該數字大於最大長度, long
是最大的基本類型。 但是,您可以將此數字表示為BigInteger 。 您甚至可以使用代碼通過左移63來生成它
BigInteger.ONE.shiftLeft(63)
你有一個整數溢出 [兩次]。
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
- 並且它不會改變它的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.