为什么编译器转换为int?

时间:2012-08-11 06:14:15

标签: java long-integer

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?

为什么第9行是编译错误?编译器无法创建Long,因为期望的类型是Long

3 个答案:

答案 0 :(得分:4)

默认情况下,整数文字是int s - 这意味着它们遵守int算术,并且它们不能代表大于int可以容纳的数字。请注意,在第4行中,首先将两个整数相乘(使用int算术),然后才将结果转换为long - 但到那时已经太晚了,溢出已经发生。

要设置long字面值,只需将L附加到其中:

long m = 10000000000L;

(小写'l'也会编译,但看起来像一个数字'1'所以你应该避免它;使用大写'L'使它突出。)

答案 1 :(得分:0)

除非另有说明,否则Literals默认为int。您可以将(long)添加到文字的末尾,而不是使用L进行投射,以指出它应该是long类型,与1.1是{double的方式相同{1}}和1.1ffloat

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

long m = 10000000000L;

答案 2 :(得分:0)

当您在java中执行任何操作时,编译器会尝试对操作数进行隐式转换,将它们转换为更大的数据类型。 (int / int = result is allways int)。

向其文字添加显式广播(默认为int),如其他答案所示:

long l = 1000000000L * 10;