Double in einen anderen numerischen Typ umwandeln

Es gibt etwas, das mich verwirrt, und ich habe nicht viele Informationen zu den VM-Spezifikationen gefunden. Es ist ein bisschen dunkel und das wäre schön, wenn mir jemand etwas erklären könnte.

Diese wenigen Codezeilen .....

<code>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);
</code>

..... diese Ausgabe erzeugen:

Schwimmer: Unendlichkeitint: 2147483647kurz: -1Byte: -1

byte, short undint sind 8, 16, 32 Bit mit Zweierkomplement.float unddouble sind 32 und 64 Bit IEEE 754 (siehe hier).

Nach meinem Verständnis ist der Maximalwert von adouble impliziert, dass alle Bits der Mantisse (52 Bits) auf 1 geschaltet werden. Daher ist es nicht (sehr) überraschend, dass eine Umwandlung zu kurz oder zu byteweise -1 zurückgibt, dh alle Bits werden auf 1 geschaltet 'Schwanz' derdouble damit es in 8 bit passtbyte oder 16 bitshort.

Was mich überrascht, ist die Besetzungint und in geringerem Maße die Besetzung vonfloat. Wie ist es möglich, "2. int: 2147483647" zu erhalten, was 0x7FFFFFFF ist, der maximale Wert, während short und byte 3. und 4. -1 sind?

Die Besetzung zufloat ist auch komisch. Liegen die 32 Bits am 'Schwanz' vonmyTest gehalten wurden, dann sollte es nicht ein generierenNaN ?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage