困惑することがあり、VMの仕様に関する情報はあまり見つかりませんでした。少しわかりにくいので、誰かが私を説明してくれたらいいのにと思います。
これらの数行のコード.....
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
32ビットおよびdouble
64ビットのIEEE754です(ここを参照)。
私の理解では、aの最大値はdouble
、仮数のすべてのビット(52ビット)が1に切り替えられることを意味します。したがって、shortまたはbyteへのキャストが-1を返すこと、つまりすべてのビットがに切り替えられることは(非常に)驚くべきことではありません。 1.キャストは、8ビットまたは16ビットdouble
に収まるようにの「テール」を保持しているようです。byte
short
私を驚かせるのは、へのキャストでint
あり、程度は少ないですが、へのキャストfloat
です。0x7FFFFFFFである「2.int:2147483647」を取得するにはどうすればよいですか。これは、shortおよびバイト3と4が-1の場合の最大値です。
キャストfloat
も変です。の「テール」の32ビットが保持されている場合、それは?myTest
を生成するべきではありません。NaN