最近、Javaの基本的な算術演算に関するJavaの特異性に気づきました。次のコードで
byte a = 3;
byte b = 4;
byte c = a * b;
「タイプの不一致」コンパイルエラーが発生します...
Javaの基本的な算術演算(、、、 )は、より高次のプリミティブデータ型(、、など)でのみ実行されますが、+
との算術演算は最初にキャストされてから評価されますか?-
*
/
int
long
double
byte
short
int
最近、Javaの基本的な算術演算に関するJavaの特異性に気づきました。次のコードで
byte a = 3;
byte b = 4;
byte c = a * b;
「タイプの不一致」コンパイルエラーが発生します...
Javaの基本的な算術演算(、、、 )は、より高次のプリミティブデータ型(、、など)でのみ実行されますが、+
との算術演算は最初にキャストされてから評価されますか?-
*
/
int
long
double
byte
short
int
byte
、char
およびに対する操作は、コンパイラが値が範囲内にあると判断できない限り、short
に拡張されます。int
final byte a = 3, b = 4;
byte c = a * b; // compiles
final byte a = 3, b = 40;
byte c = a * b; // compiles
final int a = 3, b = 4;
byte c = a * b; // compiles !!
しかし
byte a = 3, b = 4;
byte c = a * b; // doesn't compile as the result of this will be `int` at runtime.
final byte a = 30, b = 40;
byte c = a * b; // doesn't compile as the value is too large, will be an `int`
ところで、これはオーバーフローが発生してもコンパイルされます。:]
final int a = 300000, b = 400000;
int c = a * b; // compiles but overflows, is not made a `long`
整数演算の結果はまたはのいずれint
かlong
です。これはJLSで詳しく説明されています:
4.2.2。整数演算
タイプ
int
またはlong
:の値になる数値演算子。
単項プラスおよびマイナス演算子+および-(§15.15.3、§15.15.4)
乗法演算子*、/、および%(§15.17)
加法演算子+および-(§15.18)
..。
また:
5.6.2。2進数のプロモーション
演算子が2進数の昇格をオペランドのペアに適用する場合、各オペランドは数値タイプに変換可能な値を示す必要があり、次の規則が順番に適用されます。
拡大プリミティブ変換(§5.1.2)は、次の規則で指定されているように、一方または両方のオペランドを変換するために適用されます。
いずれかのオペランドがdouble型の場合、もう一方はdoubleに変換されます。
それ以外の場合、いずれかのオペランドがfloat型の場合、もう一方はfloatに変換されます。
それ以外の場合、一方のオペランドがlong型の場合、もう一方はlongに変換されます。
それ以外の場合は、両方のオペランドがint型に変換されます。
..。
2進数の昇格は、特定の演算子のオペランドに対して実行されます。
乗法演算子*、/および%(§15.17)
数値タイプ+および-の加算および減算演算子(§15.18.2)
数値比較演算子<、<=、>、および> =(§15.20.1)
数値等式演算子==および!=(§15.21.1)
整数のビット演算子&、^、および| (§15.22.1)
場合によっては、条件演算子?:(§15.25)