私はJavaを初めて使用するので、double to intキャストはどのように機能するのでしょうか。下位の32ビットを使用することで、intをlongにするのは簡単であると理解していますが、double(64ビット)からint(32ビット)はどうですか?バイナリのdoubleからのこれらの64ビットは倍精度浮動小数点形式(仮数)なので、内部でどのようにintに変換されますか?
JLSの セクション5.1. にすべて記載されています。
最初のステップでは、浮動小数点数は、Tが長い場合はlongに変換され、Tがbyte、short、char、またはintの場合はintに変換されます。
浮動小数点数がNaN(§4.2.3)の場合、変換の最初のステップの結果はintまたはlong 0になります。
それ以外の場合、浮動小数点数が無限大ではない場合、浮動小数点値は整数値Vに丸められ、IEEE 754丸めゼロモード(§4.2.3)を使用してゼロに丸められます。次に、2つのケースがあります。
Tがlongであり、この整数値をlongとして表すことができる場合、最初のステップの結果はlong値Vになります。
それ以外の場合、この整数値をintとして表すことができれば、最初のステップの結果はint値Vになります。
それ以外の場合は、次の2つのケースのいずれかに該当する必要があります。
値は小さすぎなければならず(大きさが大きい負の値または負の無限大)、最初のステップの結果は、intまたはlong型の表現可能な最小値です。
値は大きすぎなければならず(大きさが正の値または正の無限大)、最初のステップの結果は、int型またはlong型の表現可能な最大値です。
(ここでの2番目のステップは、T
がint
の場合は無関係です。)
ほとんどの場合、これはハードウェアサポートを使用して実装されると思います。浮動小数点数を整数に変換することは、通常はCPUによって処理されます。
(int)キャストを使用すると、Javaはその値を切り捨てます。
double d = 2.4d;
int i = (int) d;
System.out.println(i);
d = 2.6;
i = (int) d;
System.out.println(i);
出力:
2
2
Math.round、Math.ceil、Math.floorを使用しない限り...
Java仕様を読んでください:
http://docs.Oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.
関連するセクションは5.1.3-"Narrowing Primitive Conversion"です。