サイズが小さい型から大きい型への変換

広告

short型からint型への変換や、int型からlong型への変換などサイズが小さい型から大きい型への変換の場合、より大きな数値が格納できるところへ変換するわけですから特に意識することなく変換することができます。

次の例を見てください。

short s = 10;
int i = s;
long l = i;

2行目ではshort型の値をint型の変数に代入しています。この時、short型の値はint型に変換されてから代入されることになります。

同じように3行目ではint型の値をlong型の変数に代入しています。この時、int型の値はlong型に変換されてから代入されることになります。

このようにサイズが小さい型から大きい型への変換の場合は特に意識することなく自動的に変換が行われますし値そのものは変わりがありません。short型の10という値はint型に変換されてもint型の10になるだけです。ただし、整数から浮動小数点数に変換する場合は注意が必要です。

long型からfloat型やdouble型に変換する場合の注意点

例えばfloat型の値は負の値は -3.4028235E+38 ~ -1.401298E-45、正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値を表現できます。ただし、float型やdouble型には有効桁数というものがあり、float型ではおよそ10進数で7桁(2進数で24桁)、double型では10進数でおよそ16桁(2進数で53桁)となっています。

有効桁数とは表示された数値の中で信頼できる値が何桁あるのかということであり、もしも有効桁数が3桁であれば12.345という数値で信頼できるのは12.3まででそれ以降の数値には誤差が含まれている可能性があります。また1.2345という数値であれば信頼できるのは1.23まででそれ以降の数値には誤差が含まれている可能性があります。

このため、long型の値で7桁より大きい数値をfloat型の値に変換すると変換は行われますが7桁以降の数には誤差が含まれる可能性があります。同じように15桁以上の大きい数値をdouble型の値に変換した場合も誤差が含まれる可能性があります。

次の例を見てください。

long l = 1234567890L;
float f = l;

この場合、変換は行われますが変換前と変換後の値を画面に出力すると異なる結果となります。具体的には後のサンプルを見てください。

サンプル

では簡単な例で試しておきます。

JSample2_1.java

class JSample2_1{
  public static void main(String args[]){
    short s = 123;
    int i = s;

    System.out.println("s = " + s);
    System.out.println("i = " + i);

    long l = 123456789012345678L;
    float f = l;
    double d  = l;

    System.out.println("l = " + l);
    System.out.println("f = " + f);
    System.out.println("d = " + d);
  }
}

コンパイル後に実行すると次のように表示されます。

p2-1

long型の値をfloat型やdouble型に変換した場合、有効桁数を超えた部分については元の値と異なっていることが分かります。

( Written by Tatsuo Ikura )