jest coś dziwnego i nie znalazłem wiele informacji na temat specyfikacji VM. Jest trochę niejasny i byłoby miło, gdyby ktoś mógł mi wyjaśnić.Rzut podwójny na inny numeryczny
Te kilka linijek kodu .....
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);
..... produkować tego wyjścia:
- pływaka: Nieskończoność
- int: 2147483647
- skrócie: -1
- bajt: -1
byte
, short
i int
są 8, 16, 32-bitowe z dopełnieniem dwóch. float
i double
są 32 i 64-bitowe IEEE 754 (see here).
Z mojego rozumowania, maksymalna wartość double
sugeruje, że wszystkie bity mantysy (52 bity) są przełączone na 1. Dlatego nie jest (bardzo) zaskakujące, że rzut na krótki lub na bajt zwraca -1, wszystkie bity są przełączane na 1. Wygląda na to, że obsada utrzymuje "ogon" double
tak, że pasuje do 8 bitów byte
lub 16 bitów short
.
Co mnie zaskakuje to obsada do int
i, w mniejszym stopniu, obsada do float
. Jak to jest uzyskać "2. int: 2147483647", który jest 0x7FFFFFFF, maksymalna wartość podczas short i bajt 3. i 4. to -1?
Obsada do float
jest również dziwna. Jeśli zachowano 32 bity przy "ogonie" myTest
, to czy nie powinno to generować NaN
?
To bardzo interesujące. Tak więc, kiedy double jest rzutowany na int ("o największej reprezentowalnej wartości" w moim przykładzie), jest on rzutowany na bajt lub skrót o innej filozofii ("odrzuca wszystkie oprócz n najniższych rzędów"). – Jerome
@Jerome: Dość (poza tym uważam, że pośrednim typem jest 'long', ale nie ma to wpływu na wynik). – NPE
Warto zauważyć, że chociaż rzutowanie 'double' na' float' może spowodować, że niektóre odrębne wartości staną się nierozróżnialne, jest to niewielki problem w porównaniu do faktu, że rzutowanie 'float' na' double' może powodować rzeczy, które zamiast tego powinny być uważane za nierozróżnialne być posortowane * niesłusznie *. Na przykład, biorąc pod uwagę 'float f = 16777217; double d = 16777216.0000001; ', który jest większy -' f' lub 'd'? Co powiesz na 'float ff = 1E38f * 10f; podwójne dd = 1e300; '? Jeśli chodzi o 'ff' i' dd' jako "nierozróżnialne" nie byłoby wspaniale, ale powiedzenie 'ff> dd' jest błędne o setki rzędów wielkości. – supercat