2012-04-08 46 views
1

我有在Java中返回值不正確左位移位的問題...的Java位左移返回錯誤值

以108 < < 60實例。答案應該是*:

124515522497539473408 

Java正在這個語句,返回此值

-4611686018427387904 

System.out.println(108L << 60L); 

爲什麼???這兩個值都是強制性的,所以我沒有理由認爲任何位值應該被截斷。我在這裏錯過了什麼?

*引文:Wolfram Alpha

+3

嗯......「長」能容納的最大價值是多少? – Mysticial 2012-04-08 04:41:08

+0

我相信它在四倍數? – bgroenks 2012-04-08 18:15:03

回答

4

您正在移超出long(64位)的長度。 108佔用7位,所以108L << 60L需要67位來正確表示它。實際上,由於它是一種簽名類型,因此您需要68位來避免將其解釋爲負數。

+0

好的謝謝。我錯過了。 – bgroenks 2012-04-08 04:53:42

1

108是7位,所以< < 60是67位數。

1

代表108L << 60的數字太大,無法表示爲long。所以你已經溢出了,失去了高位。

如果要表示數字這麼大(沒有截斷),最簡單的就是使用BigInteger

順便說一句,移位運算符的第二個操作數不需要是long。通過將操作數截斷到0到63範圍內的數字(對於long班次),計算實際的班次計數 - 請參見JLS 15.19

+0

是的BigInteger的作品。 – bgroenks 2012-04-08 04:54:06