私に困惑していて、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);
.....この出力を生成:
- フロート:インフィニティ
- INT:2147483647
- 短期: -1
- バイト:-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
が生成されるべきではありませんか?
ありがとう、これは非常に興味深いです。だから、doubleがintにキャストされると(私の例では "表現可能な最大値")、それは別の考え方( "最下位ビットn以外のすべてを破棄")でバイトまたはショートにキャストされます。 – Jerome
@Jerome:かなり(私は中間型が 'long'だと思うが、結果には影響しないと思う。) – NPE
'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