1. ホーム
  2. java

[解決済み] なぜ int i = 1024 * 1024 * 1024 * 1024 はエラーなしでコンパイルできるのですか?

2022-04-27 03:54:11

質問

の限界は? int は-2147483648から2147483647までです。

と入力すると

int i = 2147483648;

と入力すると、Eclipse は "2147483648" の下に赤いアンダーラインを表示します。

でも、こうすると

int i = 1024 * 1024 * 1024 * 1024;

であれば、問題なくコンパイルできます。

public class Test {
    public static void main(String[] args) {        

        int i = 2147483648;                   // error
        int j = 1024 * 1024 * 1024 * 1024;    // no error

    }
}

Javaの基本的な質問かもしれませんが、なぜ2番目のバリアントではエラーが出ないのか、さっぱりわかりません。

どのように解決するのですか?

4つの数値を掛け合わせてint型に代入しているだけなので、たまたまオーバーフローが発生しただけで、この文は何も間違っていません。これは、1つの リテラル これはコンパイル時に境界チェックが行われます。

それは、境界外の リテラル ではなく、エラーの原因となる 代入 :

System.out.println(2147483648);        // error
System.out.println(2147483647 + 1);    // no error

これに対して long リテラルは問題なくコンパイルできます。

System.out.println(2147483648L);       // no error

なお、実際には、結果 はコンパイル時に計算されるため、まだ 1024 * 1024 * 1024 * 1024 定数式 :

int i = 1024 * 1024 * 1024 * 1024;

になります。

   0: iconst_0      
   1: istore_1      

その結果 ( 0 ) を単純にロードして保存するだけで、乗算は行われません。


から JLS §3.10.1 (コメントで話題に出してくれた@ChrisKさんに感謝)。

型の10進数リテラルを使用すると、コンパイル時のエラーになります。 int よりも大きい場合は 2147483648 (2 31 ) の場合、または10進数リテラル 2147483648 が単項マイナス演算子のオペランド以外の場所に現れた場合 ( §15.15.4 ).