akios @ ウィキ

5.1.2. 拡幅プリミティブ変換

最終更新:

akios

- view
管理者のみ編集可

5. 変換と昇格

5.1. 変換の種類

5.1.1. 恒等変換

5.1.2. 拡幅プリミティブ変換

プリミティブ型に対する19の特定の変換が拡幅プリミティブ変換(widening primitive conversion)と呼ばれます。:
  • byteshortintlongfloatdoubleへ変換
  • shortintlongfloatdoubleへ変換
  • charintlongfloatdoubleへ変換
  • intlongfloatdoubleへ変換
  • longfloatdoubleへ変換
  • floatdoubleへ変換

拡幅プリミティブ変換は数値の全体的な大きさについての情報は失いません。

整数型から他の整数型へのまたは&tt(){strictfp}式内でのfloatからdoubleへの拡幅プリミティブ変換は全く何の情報も失いません。数値は変換後も正確なままです。

strictfp式以外でのfloatからdoubleへの拡幅プリミティブ変換は変換された値の全体的な大きさという点で情報を失うかもしれません。

intlongからfloatへのまたはlongから&tt{double}への拡幅変換では精度が失われるかもしれません。つまり、変換結果は値の最も重要でないビットのいくつかが欠如するかもしれません。この場合、IEEE754の直近への丸めモードを使って、結果の浮動小数点値は元の整数値の正しく丸められたバージョンになります。

符号付きへ整数値から整数型Tへの拡幅変換は幅の広い形式を埋めるため整数値の2の補数表現の符号ビットを単純に拡張するだけです。

charの整数型Tへの拡幅変換は幅の広い形式を埋めるためchar値の表現をゼロで拡張します。

精度を失うことがあるにもかかわらず、拡幅プリミティブ変換は実行時に例外を決して起こしません(11.1.1.)。

例5.1.2-1. 拡幅プリミティブ変換

class Test {
    public static void main(String[] args) {
        int big = 1234567890;
        float approx = big;
        System.out.println(big - (int)approx);
    }
}

このプログラムは以下を出力します。:

-46

これはint型からfloat型への変換によって情報が失われたことを示しています。なぜなら、float型の値は下位9ビットが精度ではないからです。

5.1.3. 縮幅プリミティブ変換

5.1.4. 拡幅と縮幅プリミティブ変換

5.1.5. 拡幅参照変換

5.1.6. 縮幅参照変換

5.1.7. ボックス化変換

5.1.8. ボックス化解除変換

5.1.9. 未検査変換

5.1.10. 捕捉変換

5.1.11. 文字列変換

5.1.12. 禁止変換

5.1.13. 値集合変換

5.2. 代入変換

5.3. メソッド呼び出し変換

5.4. 文字列変換

5.5. キャスト変換

5.6. 数値昇格

目安箱バナー