akios @ ウィキ
5.1.2. 拡幅プリミティブ変換
最終更新:
akios
-
view
5. 変換と昇格
5.1. 変換の種類
5.1.1. 恒等変換
5.1.2. 拡幅プリミティブ変換
プリミティブ型に対する19の特定の変換が拡幅プリミティブ変換(widening primitive conversion)と呼ばれます。:
- byteをshortやint、long、float、doubleへ変換
- shortをintやlong、float、doubleへ変換
- charをintやlong、float、doubleへ変換
- intをlongやfloat、doubleへ変換
- longをfloatやdoubleへ変換
- floatをdoubleへ変換
拡幅プリミティブ変換は数値の全体的な大きさについての情報は失いません。
整数型から他の整数型へのまたは&tt(){strictfp}式内でのfloatからdoubleへの拡幅プリミティブ変換は全く何の情報も失いません。数値は変換後も正確なままです。
strictfp式以外でのfloatからdoubleへの拡幅プリミティブ変換は変換された値の全体的な大きさという点で情報を失うかもしれません。
intやlongからfloatへのまたはlongから&tt{double}への拡幅変換では精度が失われるかもしれません。つまり、変換結果は値の最も重要でないビットのいくつかが欠如するかもしれません。この場合、IEEE754の直近への丸めモードを使って、結果の浮動小数点値は元の整数値の正しく丸められたバージョンになります。
符号付きへ整数値から整数型Tへの拡幅変換は幅の広い形式を埋めるため整数値の2の補数表現の符号ビットを単純に拡張するだけです。
charの整数型Tへの拡幅変換は幅の広い形式を埋めるためchar値の表現をゼロで拡張します。
精度を失うことがあるにもかかわらず、拡幅プリミティブ変換は実行時に例外を決して起こしません(11.1.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ビットが精度ではないからです。