Подтвердить что ты не робот

0xp0 prints 0.0 (Шестнадцатеричный плавающий текст)

Мне просто интересно, почему это компилируется? и что это значит, потому что он компилируется?

System.out.println(0xp0); // p?

ВЫВОД:

0.0
4b9b3361

Ответ 1

Это шестнадцатеричный литерал с плавающей запятой.

Для шестнадцатеричных литералов с плавающей запятой требуется, по крайней мере, одна цифра (либо в целом, либо в части доли), и показатель степени является обязательным, а суффикс типа float является необязательным. Показатель обозначается буквой ASCII p или P, за которой следует необязательно целое число со знаком.

См. спецификацию здесь.

Ответ 2

JLS объясняет это:

HexadecimalFloatingPointLiteral:
    HexSignificand BinaryExponent FloatTypeSuffixopt

HexSignificand:
    HexNumeral
    HexNumeral .
    0 x HexDigitsopt . HexDigits
    0 X HexDigitsopt . HexDigits

BinaryExponent:
    BinaryExponentIndicator SignedInteger

BinaryExponentIndicator:one of
    p P

Исходя из вышеизложенного, я ожидал бы обязательный .HexDigit до p.

Ответ 3

Просто для справки, вот как вручную преобразовать следующее в десятичное число:

double hfpl = 0x1e.18p4;
System.out.println(hfpl); // 481.5

введите описание изображения здесь