2010-12-28 17 views
9

Dlaczego 0x1p3 jest równa 8.0? Dlaczego 0x1e3 jest równy 483, natomiast 0x1e3d jest równy 7741? Jest mylące od 1e3d jest równe 1000.0.Reprezentacja liczb zmiennoprzecinkowych Java jako liczby szesnastkowe

+2

Dlaczego 'p' w' 0x1p3'? – marcog

+0

@marcog jest to część sposobu wyrażania liczb zmiennoprzecinkowych, zobacz stronę JLS: http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.2 – Jesper

+0

@marcog: jest to znacznik wykładnika dla literału szesnastkowego, zmiennoprzecinkowego, zgodnie z definicją w standardach Java i C99. –

Odpowiedz

7

0x1e3 i 0x1e3d są szesnastkowy całkowitą literały. Zauważ, że e i d są cyframi heksadecymalnymi, a nie wskaźnikiem wykładniczym lub wskaźnikiem typu double w tym przypadku.

1e3d jest liczbą dziesiętną zmiennoprzecinkowa, literowa,. e jest wskaźnikiem wykładniczym, d mówi, że jest to double, a nie float.

Zapis 0x1p3 jest sposobem wyrażenia literału zmiennopozycyjnego w systemie szesnastkowym, jak można przeczytać w section 3.10.2 specyfikacji języka Java. Oznacza to 1 razy 2 do potęgi 3; wykładnik jest binarny (czyli 2-do-mocy zamiast 10-to-the-power).

+0

Ale 0x1p3 powinno być tak samo jak 1e3 w tym przypadku, prawda? Ale nie są. – serious

+0

@serious Nie, ponieważ wykładnik jest binarny, a nie dziesiętny. Jego 2^3 nie 10^3. – Jesper

+0

Och, rozumiem, dzięki. – serious

2

0x1e3 jest hex do 483, jak jest 0x1e3d hex do 7741. e jest odczytywany jako cyfry hex o wartości 14.

+1

Ah, 0x1e3 to liczba szesnastkowa, więc "e" nie oznacza tu wykładnika. – serious

+0

Ale 0x1p3 nadal nie jest jasne. – serious

+1

@serious, różnica polega na tym, że 0x1e3 jest liczbą całkowitą, a nie zmiennoprzecinkową. "E" w tej liczbie całkowitej jest tylko niefortunnym zbiegiem okoliczności, który wprowadza zamieszanie. 0x1p3 jest liczbą zmiennoprzecinkową. Jest inaczej interpretowane. Interpretacja obejmuje _mantissa_ i _exponent_. Pierwsza z nich to część 1.0 (zanotuj zakładany przecinek dziesiętny). Ta ostatnia to część "p3", która czyta "do trzeciej potęgi". Ponieważ jesteśmy binarni, wzięcie liczby do trzeciej potęgi jest takie samo, jak przesunięcie 3 bitów w lewo, więc 0b1 staje się 0b1000. To 8 w systemie dziesiętnym. –

Powiązane problemy