6

好吧,我已经用 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

我没想到这一点,无法找出它的意思。如果你不知道,我指的是在这些数字之后,减法运算符之前的pand 。P我知道您可以使用后缀将数字强制为double, long,float等,但我从未遇到过por 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#= 二进制(以 2 为基数)文字
  • 0B#=另一个二进制(基数2)文字?
  • 0#= 八进制(以 8 为基数)文字
  • #= 十进制(以 10 为底)文字
  • 0x#= 十六进制(以 16 为基数)文字
  • 0X#= 另一个十六进制(以 16 为底)文字?
  • 还有吗?

其他(这些有后缀或前缀吗?):

  • (byte)#= 8 位整数byte
  • (short)#= 16 位整数short
  • (char)#- 32 位字符char
4

3 回答 3

7

P 是指数。不管是不是资本。

根据JavadoctoHextString(我们知道正在使用它,因为它以 开头0x

public static String toHexString(double d)返回双参数的十六进制字符串表示。下面提到的所有字符都是 ASCII 字符。如果参数为 NaN,则结果为字符串“NaN”。否则,结果是一个字符串,表示参数的符号和大小。如果符号为负,则结果的第一个字符为'-'('\u002D');如果符号为正,则结果中不会出现符号字符。至于大小 m:

  • 如果m为无穷大,则用字符串“Infinity”表示;因此,正无穷产生结果“Infinity”,负
    无穷产生结果“-Infinity”。

  • 如果 m 为零,则用字符串“0x0.0p0”表示;因此,负零产生结果“-0x0.0p0”,正零产生结果“0x0.0p0”。

  • 如果 m 是具有标准化表示的双精度值,则使用子字符串来表示有效数字和指数字段。有效数字由字符“0x1”表示。后跟小写十六进制表示的有效数字的其余部分作为分数。除非所有数字都为零,否则十六进制表示中的尾随零被删除,在这种情况下使用单个零。接下来,指数由“p”表示,后跟无偏指数的十进制字符串,就好像通过对指数值调用 Integer.toString 产生的一样。

  • 如果 m 是具有次正规表示的双精度值,则有效数字由字符“0x0”表示。后跟以分数表示的其余有效数字的十六进制表示。十六进制表示中的尾随零被删除。接下来,指数由“p-1022”表示。请注意,次正规有效数中必须至少有一个非零数字。

根据JLS,接受以下语法:

3.10.1. Integer Literals

IntegerTypeSuffix

  • l
  • 大号

八进制数:

  • 0 个八进制数
  • 0 下划线 OctalDigits

十六进制数:

  • 0 x 十六进制数
  • 0 X 十六进制数

二进制数字:

  • 0 b 二进制数
  • 0 B 二进制数

3.10.2. Floating-Point Literals

指数指标:其中之一

  • e

FloatTypeSuffix:其中之一

  • F
  • F
  • d
  • D

十六进制符号:

  • 十六进制数
  • 十六进制数。
  • 0 x HexDigitsopt 。十六进制数
  • 0 X HexDigitsopt 。十六进制数

BinaryExponentIndicator:其中之一

  • p

没有为这些目的指定其他单字符文字。

于 2012-08-30T23:08:06.067 回答
3

声明文字的所有合法方式都在JLS中定义。

  • porP是一个数字的二进制指数。
  • lL定义一个long.
  • fF定义一个float.
  • dD定义一个double.
  • 0B0b定义二进制文字。
  • 0x0X定义十六进制文字。
  • eorE也是一个指数,但因为e是十六进制的有效字符,p所以也被使用。
于 2012-08-30T23:09:39.763 回答
0

P或者p是一个BinaryExponentIndicator。请参阅 Java 语言规范。

请参阅http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.10.2

于 2012-08-30T23:12:00.203 回答