0xp0 prints 0.0 (Шестнадцатеричный плавающий текст)
Мне просто интересно, почему это компилируется? и что это значит, потому что он компилируется?
System.out.println(0xp0); // p?
ВЫВОД:
0.0
Ответы
Ответ 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
![введите описание изображения здесь]()