私は Java が初めてで、double から int へのキャストがどのように機能するのか疑問に思っています。下位32ビットを取得することで long から int への変換が簡単であることは理解していますが、 double (64 ビット) から int (32 ビット) への変換はどうでしょうか? バイナリの double からの 64 ビットは倍精度浮動小数点形式 (仮数部) になっているため、内部でどのように int に変換されますか?
3 に答える
これはすべて、JLS のセクション 5.1.3に記載されています。
最初のステップでは、次のように、浮動小数点数は、T が long の場合は 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.3
関連するセクションは5.1.3-「プリミティブ変換のナローイング」です。