4

JLS 3.10.1. Integer Literals http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1の状態

The largest decimal literal of type int is 2147483648.

同時にこのライン

int x = 2147483648;

コンパイルエラーを生成します

The literal 2147483648 of type int is out of range

JLSは間違っていますか?

4

3 に答える 3

6

それは言葉遣いが悪いです。この式で何を言おうとしているのか:

-2147483648

マイナス記号は整数リテラルの一部ではなく、マイナス記号は単項マイナス演算子2147483648ありintリテラルであり、整数リテラル2147483648はこの正確な式でのみ使用できます。

于 2013-05-04T02:18:45.263 に答える
5

JLSは間違っていますか?

いいえ、JLS は具体的です。int 変数と「int リテラル」、つまり int 型の 10 進リテラルを区別してください。

int 変数の範囲は -2,147,483,648..2,147,483,647 (つまり -(2^31)..2^31-1) です。

コンパイラが Java コードで解析し、コンテキストで使用する最大の10 進数リテラルintは 2,147,483,648 ですが、単項「-」演算子のオペランドとしてのみ使用できます。つまり、1 つの方法でしか使用できません。 - int が保持できる最も負の 10 進数値を構築するには: -22147483648.

あなたが言及したJLSのそのセクションでは、セクション 3.10.1 Integer Literalsに次のように書かれています。

int 型の最大の 10 進数リテラルは 2147483648 (2^31) です。

また、数行後に次のように述べています。

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

于 2013-05-04T02:22:52.840 に答える
3

int 型の最大の 10 進数リテラルは 2147483648 (231) です。

All decimal literals from 0 to 2147483647 may appear anywhere an int literal may appear. 

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

于 2013-05-04T02:15:02.357 に答える