簡體   English   中英

位移操作不會返回預期結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM