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: -1byte
, 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
?