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行输出:1410065408而不是10000000000?
为什么第9行是编译错误?编译器无法创建Long
,因为期望的类型是Long
?
答案 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.1f
是float
。
foo(1000000000L * 10); // output: 10000000000
和
long m = 10000000000L;
答案 2 :(得分:0)
当您在java中执行任何操作时,编译器会尝试对操作数进行隐式转换,将它们转换为更大的数据类型。 (int / int = result is allways int)。
向其文字添加显式广播(默认为int
),如其他答案所示:
long l = 1000000000L * 10;