演算の時に自動的に行われる型変換

加算や減算などの演算が行われるときに、対象の値のデータ型が異なる場合は自動的に型変換が行われます。ここでは Java で演算時に自動的に行われる型変換について解説します。

(Last modified: )

演算時の型変換のルール

例えば 16 / 2 のように演算子の左辺と右辺の値のデータ型がともに int 型であればそのまま演算が行われますが、 16 / 2.0 のように片方が int 型で片方が double 型の場合には型変換がまず行われます。

演算時の型変換が行われるルールは次のようになっています。

(1) どちらかの値が double 型の場合は他の値を double 型に変換する
(2) どちらかの値が float 型の場合は他の値を float 型に変換する
(3) どちらかの値が long 型の場合は他の値を long 型に変換する
(4) (1)から(3)に該当しない場合は両方の値を int 型に変換する

このルールは(1)から順に適用され、いずれかに適用されればそれ以降の変換は行われません。例えば double 型と long 型の値の演算では、(1)のルールが適用されるので long 型の値が double 型に変換されて演算が行われます。なお(4)の型変換は両方の値のデータ型が同じ場合であっても行われる点に注意してください。

次のサンプルをみてください。

double d = 10 * 0.2;

演算子の左辺の値 10 が int 型で、右辺の値 0.2 が double 型なので、左辺の値がまず double に変換されます。そして演算子した結果 2.0 を double 型の変数に代入しています。

この時、演算した結果を int 型の変数に代入しようとするとエラーになるのでご注意ください。

int i = 10 * 0.2;  // エラー

演算した結果は double 型の値なので、 int 型の変数に代入するには次のようにキャスト演算子を使った明示的な型変換が必要となります。

int i = (int)(10 * 0.2);

※ キャスト演算子の使い方については「キャスト演算子と型変換ルール」を参照されてください。

int型への変換に伴う注意点

演算子のときの型変換は、どちらかの値が double 型か float 型か long 型でない場合は両方の値を int 型に変換したあとで演算が行われます。これは両方の値が short 型や byte 型であってもまず両方の値を int 型に変換してから演算することを意味しています。

次のサンプルをみてください。

short s1 = 14;
short s2 = 8;
int i = s1 + s2;

s1 と s2 は共に short 型の値です。 s1 + s2 の演算はどちらの値も double 型でも float 型でも long 型でもないので、 s1 および s2 はどちらも int 型に型変換されてから演算が行われます。 int 型と int 型の演算結果は int 型なので、 int 型の変数にそのまま代入することができます。

これを次のように書いてしまうとエラーになってしまうのでご注意ください。 short 型と short 型の演算結果は short 型にはなりません。

short s1 = 14;
short s2 = 8;
short s3 = s1 + s2;

もし演算結果を short 型の変数に代入するには次のようにキャスト演算子を使った明示的な型変換が必要となります。

short s1 = 14;
short s2 = 8;
short s3 = (short)(s1 + s2);

同じように単項マイナス演算子(-)を使って符号を反転する場合にも注意が必要です。次のサンプルをみてください。

short s1 = 12;
short s2 = -s1;  // エラー

short 型の変数 s1 に単項マイナス演算子を使用して符号を反転したものを short 型の変数 s2 に代入しようとしていますがコンパイルエラーとなります。これは単項マイナス演算子を使用することで型変換のルールが適用されて s1 が int 型に自動的に型変換されるためです。その結果 -s1 は int 型の値となるため、 short 型の変数に代入するには明示的な型変換が必要となります。

short s1 = 12;
short s2 = (short)-s1;

どちらもエラーとなっている原因が分かりにくいものなので、 short 型や byte 型の値で演算を行う場合には注意してください。

-- --

Java で演算時に自動的に行われる型変換について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。