好吧,我已经用Java编程了三年的大部分时间,现在,并认为自己非常有经验。但是,在查看Java SE源代码时,我遇到了一些我没想到的事情:
<{1}}class
中的:
Double
我没想到这一点,也无法找出它的含义。如果您不知道,我指的是减法运算符之前的public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
和p
。我知道您可以使用后缀强制数字为P
,double
,long
等,但我从未遇到过float
或{{1 }}。我查了the Java API,但没有提到它。 在某处有完整的 Java原始数字文字修饰符列表吗?有谁知道这些?
作为参考,以下是我使用或遇到过的,其目的是以粗体显示问号(p
代表相应限制内的任意数字):
后缀:
P
= 32位整数#
#
= 64位整数int
#L
=另一个64位整数long
? #l
= 32位浮点l
#f
=另一个32位浮点float
? #F
= 64位浮点float
#d
=另一个64位浮点double
? #D
=科学记谱法double
=另一种科学记数法? #e#
=? #E#
=? 前缀:
#p
= binary(base 2)literal #P
=另一个二进制(基数为2)字面值? 0b#
=八进制(base 8)literal 0B#
= decimal(base 10)literal 0#
=十六进制(base 16)literal #
=另一个十六进制(基数为16)字面值? 其他(是否有后缀或前缀?):
0x#
= 8位整数0X#
(byte)#
= 16位整数byte
(short)#
- 32位字符short
答案 0 :(得分:7)
P是指数。它是否是资本并不重要。
根据Javadoc for toHextString
(我们知道正在使用它,因为它以0x
开头:
public static String toHexString(double d)
返回double参数的十六进制字符串表示形式。下面提到的所有字符都是ASCII字符。如果参数是NaN,则结果是字符串“NaN”。否则,结果是一个表示参数的符号和大小的字符串。如果符号为负数,则结果的第一个字符为' - '('\ u002D');如果符号为正,则结果中不会出现符号字符。至于幅度m:
如果m是无穷大,则用字符串“Infinity”表示;因此,正无穷大产生结果“无穷大”和负数 无穷大产生结果“-Infinity”。
如果m为零,则由字符串“0x0.0p0”表示;因此,负零产生结果“-0x0.0p0”,正零产生结果“0x0.0p0”。
如果m是具有规范化表示的double值,则子串用于表示有效数和指数字段。有效数字由字符“0x1”表示。其次是有效数字的其余部分的小写十六进制表示形式。除非所有数字都为零,否则将删除十六进制表示中的尾随零,在这种情况下使用单个零。接下来,指数由“p”表示,后跟无偏指数的十进制字符串,就好像通过对指数值调用Integer.toString产生的那样。
如果m是具有次正规表示的double值,则有效数字由字符“0x0”表示。然后是有效数字的其余部分的十六进制表示作为分数。删除十六进制表示中的尾随零。接下来,指数由“p-1022”表示。请注意,次正规有效数字中必须至少有一个非零数字。
根据JLS,接受以下语法:
3.10.1. Integer Literals
IntegerTypeSuffix
:
- l
- →
OctalNumeral:
- 0 OctalDigits
- 0 Underscores OctalDigits
HexNumeral:
- 0 x HexDigits
- 0 X HexDigits
BinaryNumeral:
- 0 b BinaryDigits
- 0 B BinaryDigits
3.10.2. Floating-Point Literals
ExponentIndicator:
之一
- e
- 电子
FloatTypeSuffix:
之一
- ˚F
- F
- d
- d
HexSignificand:
- HexNumeral
- HexNumeral。
- 0 x HexDigitsopt。 HexDigits
- 0 X HexDigitsopt。 HexDigits
BinaryExponentIndicator:
之一
- p
- P
没有为这些目的指定其他单个字符文字。
答案 1 :(得分:3)
声明文字的所有合法方式都在JLS。
中定义p
或P
是数字的二进制指数。l
或L
定义了long
。f
或F
定义了float
。d
或D
定义了double
。0B
或0b
定义了二进制文字。0x
或0X
定义了十六进制文字。e
或E
也是指数,但由于e
是十六进制的有效字符,因此也会使用p
。答案 2 :(得分:0)
P
或p
是BinaryExponentIndicator
。请参阅Java语言规范。
请参阅http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.10.2