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 行目の出力: 10000000000 ではなく 141006540​​8 なのですか?

なぜ9行目はコンパイルエラーなのですか? Long期待される型が a であるため、コンパイラは a を作成できませんLongか?

4

3 に答える 3

4

デフォルトでは、整数リテラルはints です。つまり、整数リテラルは int 演算に従い、 が保持できるよりも大きな数値を表すことはできませんint。4 行目では、2 つの int が最初に (int 算術を使用して) 乗算され、その結果がlong-- にキャストされることに注意してください。

リテラルを入れるには、それlongに追加Lするだけです:

long m = 10000000000L;

(小文字の「l」もコンパイルされますが、数字の「1」のように見えるので避ける必要があります。目立つように大文字の「L」を使用してください)。

于 2012-08-11T06:17:06.877 に答える
0

特に指定がない限り、リテラルのデフォルトは int です。でキャストする代わりに、リテラルの末尾に(long)追加して、それが aおよびaであるのと同じように、Ltype である必要があることに注意することができます。long1.1double1.1ffloat

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

long m = 10000000000L;
于 2012-08-11T06:18:41.250 に答える
0

Java で操作を実行すると、コンパイラはオペランドへの暗黙的なキャストを行い、両方をより大きなデータ型に変換しようとします。(int / int = 結果は常に int です)。

int他の回答に示されているように、リテラルに明示的なキャストを追加します (デフォルトは)。

long l = 1000000000L * 10;
于 2012-08-11T06:25:52.127 に答える