2 -12 : 異なる基本データ型同士の代入変換

異なる基本データ型変数同士の代入変換(=)はその表現可能なサイズにより可能な場合とコンパイルエラーになる場合がある。

変換可能なパターンは右辺より左辺の方がサイズが大きい場合となる。
  可能な条件:左辺表現サイズ >= 右辺表現サイズ
自分は誤って
「long は 64ビットで float は 32ビットだから long の方がサイズが大きいため、 long から float への代入変換はコンパイルエラーとなり、float から long への変換は可能」
と覚えていた。これは誤りで全く逆だ。ここで言う表現可能サイズとはビットサイズではなく、表せる数値のことを指す。そのため float は小数点が移動するため long よりもより大きい数値を保持できる。

この考えを元に変換可能な関係をまとめた。

     char↓
        int → long → float → double
byte→short↑

       変換可能関係図

矢印の元から先にたどれる場合は変換可能であり、その他はすべてコンパイルエラーとなる。 流れが二つに分かれているのは char が特別なためだ。 char は 2byte で符号なし数値を扱う。そのため符号有り2byteの short とは互換性がない。
試験でこの図を思い出すには、まず char を無視して整数型をサイズが小さい順に並べる。
( byte → short → int → long)
そして小数方をその右につける。
(long → float → double)
最後に char は short と同じ容量であるため、short と同じ階層におき、その上の int に矢印を引っ張る。
(short → int)
これを試験でどこかにメモっておけば分かりやすい。

[StdDataCast.java] (コンパイル不可)
/**
* 異なる基本データ型同士の代入変換 テストクラス
* 基本データ型(size [bit])

* boolean (1)
* byte (8)
* int (32)
* float (32)
* char (16)
* short (16)
* long (64)
* double (64)
*
*/
public class StdDataCast {

public static void main(String[] args) {
// 代入用データ
boolean fBoolean = false;
char fChar = '0';
byte fByte = 0;
short fShort = 0;
int fInt = 0;
long fLong = 0L;
float fFloat = 0F;
double fDouble = 0.0;

// boolean <-> 他基本データ型
boolean bool = true;
int boolInt = bool; // コンパイルエラー
bool = fInt; // // コンパイルエラー

// char <-> 他基本データ型
char cha = '0';
byte chaByte = cha; // コンパイルエラー
short chaShort = cha; // コンパイルエラー
int chaInt = cha;
long chaLong = cha;
float chaFloat = cha;
double chaDouble = cha;

cha = fByte; // コンパイルエラー
cha = fShort; // コンパイルエラー
cha = fInt; // コンパイルエラー
cha = fLong; // コンパイルエラー
cha = fFloat; // コンパイルエラー
cha = fDouble; // コンパイルエラー

// byte <-> 他基本データ型
byte byt = 0;
char bytChar = byt; // コンパイルエラー(表す値の範囲が異なる)
short bytShort = byt;
int bytInt = byt;
long bytLong = byt;
float bytFloat = byt;
double bytDouble = byt;

byt = fChar; // コンパイルエラー
byt = fShort; // コンパイルエラー
byt = fInt; // コンパイルエラー
byt = fLong; // コンパイルエラー
byt = fFloat; // コンパイルエラー
byt = fDouble; // コンパイルエラー

// short <-> 他基本データ型
short sho = 0;
char shoShort = sho;
byte shoByte = sho;
int shoInt = sho;
long sboLong = sho;
float shoiFloat = sho;
double shoDouble = sho;

sho = fChar; // コンパイルエラー
sho = fByte;
sho = fInt; // コンパイルエラー
sho = fLong; // コンパイルエラー
sho = fFloat; // コンパイルエラー
sho = fDouble; // コンパイルエラー

// int <-> 他基本データ型
int in = 0;
char inChar = in; // コンパイルエラー
byte inByte = in; // コンパイルエラー
short inShort = in;// コンパイルエラー
long inLong = in;
float inFloat = in;
double inDouble = in;

in = fChar;
in = fByte;
in = fShort;
in = fLong; // コンパイルエラー
in = fFloat; // コンパイルエラー
in = fDouble;

// long <-> 他基本データ型
long lo = 0;
char loChar = lo; // コンパイルエラー
byte loByte = lo; // コンパイルエラー
short loShort = lo;// コンパイルエラー
int loInt = lo;// コンパイルエラー
long loLong = lo;
float loFloat = lo;
double loDouble = lo;

lo = fChar;
lo = fByte;
lo = fShort;
lo = fInt;
lo = fFloat; // コンパイルエラー
lo = fDouble; // コンパイルエラー

// float <-> 他基本データ型
float fl = 0.0F;
char flChar = fl; // コンパイルエラー
byte flByte = fl; // コンパイルエラー
short flShort = fl;// コンパイルエラー
int flInt = fl; // コンパイルエラー
long flLong = fl; // コンパイルエラー
double flDouble = fl;

fl = fChar;
fl = fByte;
fl = fShort;
fl = fInt;
fl = fLong;
fl = fDouble; // コンパイルエラー

// double <->他データ型
double dou = 0.0;
char douChar = dou; // コンパイルエラー
byte douByte = dou; // コンパイルエラー
short douShort = dou; // コンパイルエラー
int douInt = dou; // コンパイルエラー
long douLong = dou; // コンパイルエラー
float douFloat = dou; // コンパイルエラー

dou = fChar;
dou = fByte;
dou = fShort;
dou = fLong;
dou = fFloat;
dou = fDouble;
}

}