2012-08-11 75 views
1
1 public class Foo { 
2 public static void main(String[]a){ 
3  foo(1000000000); // output: 1000000000 
4  foo(1000000000 * 10); // output: 1410065408 
5  foo((long)1000000000 * 10); // output: 10000000000 
6  
7  long l = 1000000000 * 10; 
8  foo(l); // output: 1410065408 
9  //long m = 10000000000; // compile error 
10 } 

    static void foo(long l){ 
     System.out.println(l); 
    } 
} 

爲什麼第4行輸出:141006540​​8而不是10000000000?爲什麼編譯器需要很長的時間來處理int?

爲什麼第9行是編譯錯誤?編譯器不能創建Long,因爲預期類型是Long

回答

4

默認情況下,整數文字是int s - 表示它們遵守int算術,並且它們不能表示大於int可以容納的數字。請注意,在第4行中,首先將兩個整數相乘(使用整數運算),然後纔將結果輸出到long - 但是到時候它已經太晚了,並且溢出已經發生。

要放long文字,只是追加L它:

long m = 10000000000L; 

(小寫的「L」也將編譯,但看起來像一個數字「1」,所以你應該避免;使用大寫'L'以使其脫穎而出)。

+1

奇怪,(INT * INT)沒有得到晉升爲長時,結果會溢出的int 。 – Scooter 2012-08-11 06:27:42

0

除非另有說明,文字默認爲int。您可以將L添加到文字的末尾,而不是使用(long)進行投射,以便注意它應該是long類型,與1.1double1.1ffloat的方式相同。

foo(1000000000L * 10); // output: 10000000000 

long m = 10000000000L; 
0

當您在Java執行任何操作,編譯器試圖讓隱式轉換到操作數轉換兩者的更大的數據類型。 (int/int =結果是allways int)。

添加一個顯式的在其他的答案表明了自己的文字(默認爲int):

long l = 1000000000L * 10; 
相關問題