2012-05-07 6 views
5

私に困惑していて、VM仕様に関する多くの情報が見つかりませんでした。それは少し不明で、誰かが私を説明することができればいいと思う。もう1つの数値型をdouble型にキャストすると

コードのこれらの数行は.....

double myTest = Double.MAX_VALUE; 

System.out.println("1. float: " + (float)myTest); 
System.out.println("2. int: " + (int)myTest); 
System.out.println("3. short: " + (short)myTest); 
System.out.println("4. byte: " + (byte)myTest); 

.....この出力を生成:

  1. フロート:インフィニティ
  2. INT:2147483647
  3. 短期: -1
  4. バイト:-1

byte,shortおよびintは、2の補数で8,16,32ビットです。 floatおよびdoubleは、32および64ビットIEEE754(see here)です。

doubleの最大値は、mantisse(52ビット)のすべてのビットが1に切り替わることを意味します。したがって、shortまたはbyteへのキャストが-1を返すということは(非常に)驚くことではありません。すべてのビットが1に切り替わります。キャストはdoubleの 'tail'を保持しているので、8ビットのbyteまたは16ビットのshortに収まります。

キャストはintにキャストされ、キャストはfloatになります。 0x7FFFFFFFである「2. int:2147483647」を得る方法はありますか?shortと3と4の間の最大値は-1ですか?

floatへのキャストも奇妙です。 myTestの 'tail'の32ビットが保持されていた場合は、NaNが生成されるべきではありませんか?

答えて

4

JLSは、セクション5.1.3 Narrowing Primitive Conversionのルールを綴っています。ルールはターゲットタイプによって異なります。

float

:ダブルからフロートへ

狭くプリミティブ変換は、IEEE 754丸めルール(4.2.4)によって支配されます。この変換は精度を損なう可能性がありますが、範囲を失うため、ゼロ以外の倍精度浮動小数点数(float zero)と有限倍精度浮動小数点数(float infinity)が生成されます。 double NaNはfloat NaNに変換され、double infinityは同じ符号付きfloat infinityに変換されます。

intlong

以下の2つのケースのいずれかが真でなければならない:

  • ...
  • 値が大きすぎなければなりません(正の値大きな正または正の無限大)、最初のステップの結果はint型またはlong型の表現可能な最大値です。

bytecharshort

ターゲット型がbytechar又はshortある場合、変換その二段階。まず、doubleは、上記のようにlongに変換されます。

Tは単に全てが、Nは使用されるビットの数であり、nは最下位ビットを破棄一体型の符号付き整数の縮小変換を次のように、longは、最終型に変換されタイプTを表します。数値の大きさに関する情報の損失の可能性に加えて、結果として得られる値の符号と入力値の符号が異なる可能性があります。

+0

ありがとう、これは非常に興味深いです。だから、doubleがintにキャストされると(私の例では "表現可能な最大値")、それは別の考え方( "最下位ビットn以外のすべてを破棄")でバイトまたはショートにキャストされます。 – Jerome

+0

@Jerome:かなり(私は中間型が 'long'だと思うが、結果には影響しないと思う。) – NPE

+0

'float'に' double'をキャストするといくつかの異なる値が区別できなくなるかもしれませんが、floatを 'double'にキャストすると区別がつかないものになる可能性がある間違ってソートされる*。たとえば、 'float f = 16777217;とすると、 double d = 16777216.0000001; '、より大きい - ' f'または 'd'?どうすれば 'float ff = 1E38f * 10f; double dd = 1e300; '? 'ff'と' dd'を「区別できない」ものとしては大したことではありませんが、 'ff> dd'というのは数百倍の誤りです。 – supercat

関連する問題