▲ | ▼ | 目次 | KnowHowTop |
Java では、代入や演算で使用する変数にの型について暗示的に型変換が行われたり、明示的に型変換を行ったりする必要があります。
Java では、代入や演算において short 型から int 型への代入のように「精度の低い型→精度の高い型」の代入を行う場合、精度の低い型は精度の高い方の型に暗示的に型変換されます。
これを、拡張型変換と呼びます。
この拡張型変換はオペランドを 2 つ持つ演算式のにおいて、ある規則にのっとって行われます。
この規則を理解していないとコンパイルエラーとなるので注意が必要です。
優先 | 拡張変換の規則 |
---|---|
1 | オペランドの一方が double 型の場合、他方も double 型に変換される |
2 | オペランドの一方が float 型の場合、他方も float 型に変換される |
3 | オペランドの一方が long 型の場合、他方も long 型に変換される |
4 | 両方のオペランドは int 型に変換される |
上記した表より、演算式は最小でもintに拡張変換されることがわかります。
したがって、以下のコードはコンパイルエラーとなります。
byte b1 = 10; byte b2 = 20; byte b3 = b1 + b2; // b1,b2は int 型に変換されるため演算結果も int 型となる。
代入や演算ににおいて暗示的な型が行われない場合、明示的に型変換を行うことをキャストといいます。
キャストは変換したい値(変数)の前に変換したい型を( )で囲みます。
ケース | 例 |
---|---|
int 型を byte 型に変換 | byte i = (byte)100; |
long 型を int 型に変換 | int i = (int)100L; |
float 型を int 型に変換 | int i = (int)f; ※ f は変数 |
例えば、拡張変換で示したコンパイルエラーとなるソースコードの例はキャストすることで解決します。
byte b1 = 10; byte b2 = 20; byte b3 = (byte)(b1 + b2); //演算結果はbyteにキャストされるのでOK ※ 以下の書き方はコンパイルエラーです。 byte b3 = (byte)b1 + (byte)b2;
このようにキャストを行えば精度の高い型を精度の低い型に変換することが可能となりますが、次のようなことをした場合は、値が変わる恐れがあります。
int i = (int)12.5F; System.out.print(i);
プログラムの実行結果は以下のようになります。
12