2012-08-11 77 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; 
相关问题