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?

为什么第 9 行是编译错误?编译器不能创建 aLong因为预期的类型是 aLong吗?

4

3 回答 3

4

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

要输入long文字,只需附加L到它:

long m = 10000000000L;

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

于 2012-08-11T06:17:06.877 回答
0

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

int如其他答案所示,为您的文字添加显式转换(默认为):

long l = 1000000000L * 10;
于 2012-08-11T06:25:52.127 回答
0

除非另有说明,否则文字默认为 int。(long)您可以在文字的末尾添加而不是强制转换,L以注意它应该是 type long,就像1.1adouble1.1fis a一样float

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

long m = 10000000000L;
于 2012-08-11T06:18:41.250 回答