Rzucanie podwójnego do innego typu numerycznego

coś mnie zastanawia i nie znalazłem wiele informacji na temat specyfikacji VM. To trochę niejasne i byłoby miło, gdyby ktoś mógł mi wyjaśnić.

Te kilka wierszy kodu .....

<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>

..... wyprodukuj to wyjście:

float: Infinityint: 2147483647krótki: -1bajt: -1

byte, short iint są 8, 16, 32 bitów z dopełnieniem dwóch.float idouble są 32 i 64 bitowe IEEE 754 (Spójrz tutaj).

Z mojego zrozumienia, maksymalna wartość adouble sugeruje, że wszystkie bity mantysy (52 bity) są przełączane na 1. Dlatego nie jest (bardzo) zaskakujące, że rzut na krótki lub bajt zwraca -1, tj. wszystkie bity są przełączane na 1. Wygląda na to, że rzut zachowuje „ogon”double tak, że pasuje do 8 bitówbyte lub 16 bitówshort.

To, co mnie zaskakuje, to obsadaint i, w mniejszym stopniu, obsadafloat. Jak można uzyskać „2. int: 2147483647”, czyli 0x7FFFFFFF, maksymalną wartość podczas krótkiego i bajtu 3 i 4. to -1?

Obsada dofloat jest też dziwne. Jeśli 32 bity na „ogonie”myTest zostały zachowane, to nie powinno generowaćNaN ?

questionAnswers(1)

yourAnswerToTheQuestion