Sup*_*tar 6 java primitive modifier prefix primitive-types
好吧,我现在已经用Java编程了三年的时间,并认为自己非常有经验.但是,在查看Java SE源代码时,我碰到了一些我没想到的东西:
在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
Run Code Online (Sandbox Code Playgroud)
我没想到这一点,也无法找出它的含义.如果你不知道,我指的是p和P是这些数字后,减法运算符之前.我知道你可以使用后缀来迫使数是一个double,long,float等等,但我从来没有遇到过p或P.我检查了Java API,但没有提到它.某处是否有完整的Java原始数字文字修饰符列表?有人都知道吗?
作为参考,下面是我使用或遇到的那些,其目的是以粗体标记我的问号(#代表相应限制内的任意数字):
后缀:
# = 32位整数 int#L = 64位整数 long#l=另一个64位整数l?#f = 32位浮点 float#F=另一个32位浮点float?#d = 64位浮点 double#D=另一个64位浮点double?#e# =科学记数法#E# =另一种科学记数法?#p =?#P =?前缀:
0b# = binary(base 2)literal0B# =另一个二进制(基数2)字面值?0# =八进制(基数为8)字面值# =十进制(基数10)字面值0x# =十六进制(base 16)字面值0X# =另一个十六进制(基数为16)字面值?其他(这些是后缀或前缀?):
(byte)# = 8位整数 byte(short)# = 16位整数 short(char)# - 32位字符 charP是指数.它是否是资本并不重要.
根据Javadoc fortoHextString(我们知道它正在使用,因为它始于0x:
public static String toHexString(double d)返回double参数的十六进制字符串表示形式.下面提到的所有字符都是ASCII字符.如果参数是NaN,则结果是字符串"NaN".否则,结果是一个表示参数的符号和大小的字符串.如果符号为负数,则结果的第一个字符为' - '('\ u002D'); 如果符号为正,则结果中不会出现符号字符.至于幅度m:
如果m是无穷大,则用字符串"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:
- 升
- 大号
OctalNumeral:
- 0 OctalDigits
- 0下划线OctalDigits
HexNumeral:
- 0 x HexDigits
- 0 X HexDigits
BinaryNumeral:
- 0 b BinaryDigits
- 0 B BinaryDigits
3.10.2. Floating-Point Literals
ExponentIndicator:其中之一
- Ë
- Ë
FloatTypeSuffix:其中之一
- F
- F
- d
- d
HexSignificand:
- HexNumeral
- HexNumeral.
- 0 x HexDigitsopt.HexDigits
- 0 X HexDigitsopt.HexDigits
BinaryExponentIndicator:其中之一
- p
- P
没有为这些目的指定其他单个字符文字.