【问题标题】:What are the Java primitive data type modifiers?什么是 Java 原始数据类型修饰符?
【发布时间】:2012-08-25 18:26:25
【问题描述】:

好的,我已经用 Java 编程了三年了,现在我认为自己非常有经验。然而,在查看 Java SE 源代码时,我遇到了一些我没想到的事情:

classDouble:

public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308

public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324

我没想到会这样,也不知道这意味着什么。如果您不知道,我指的是在这些数字之后、减法运算符之前的pP。我知道您可以使用后缀将数字强制为doublelongfloat 等,但我从未遇到过pP。我检查了the 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

【问题讨论】:

  • JLS 是您的朋友。当你发现一个你不理解的语言元素时,不要去教程,去指定语言的那个。

标签: java primitive prefix primitive-types modifier


【解决方案1】:

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

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

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

  • 如果m为无穷大,则用字符串“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
  • L

八进制数:

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

十六进制数:

  • 0 x HexDigits
  • 0 X HexDigits

二进制数字:

  • 0 b BinaryDigits
  • 0 B 二进制数

3.10.2. Floating-Point Literals

ExponentIndicator:其中之一

  • e
  • E

FloatTypeSuffix: 之一

  • f
  • F
  • d
  • D

十六进制数:

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

BinaryExponentIndicator:其中之一

  • p
  • P

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

【讨论】:

    【解决方案2】:

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

    • pP 是数字的二进制指数。
    • lL 定义了一个 long
    • fF 定义了一个 float
    • dD 定义了一个 double
    • 0B0b 定义二进制字面量。
    • 0x0X 定义十六进制文字。
    • eE 也是指数,但由于 e 是十六进制的有效字符,因此也使用 p

    【讨论】:

    • 我会选择这个作为答案,因为它与我的问题最密切相关,但它缺少 eE。你确定这是一个完整的列表吗?
    • @Supuhstar 我刚刚浏览了 JLS 并标记了后缀和前缀的所有实例。
    • @Supuhstar 我从来没有声称这是一个完整的列表。我正在回应 OP 的粗体项目。好像错过了一个
    【解决方案3】:

    PpBinaryExponentIndicator。请参阅 Java 语言规范。

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

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2010-11-01
      • 1970-01-01
      • 2011-02-17
      • 2016-08-16
      • 2014-05-09
      • 2013-01-06
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多