【问题标题】:Java hexadecimal base double literalJava 十六进制基础双字面量
【发布时间】:2017-08-01 01:32:52
【问题描述】:

我正在学习java认证。我对java文字很好奇。 我知道可以这样做:

int i = 0xAA;
long l = 0xAAL;

这对于浮点变量也是可能的:

double d = 123d;
float f = 123f;

所以我在逻辑上认为这些示例同样适用于十六进制。就像我可以为长文字添加 L 一样,我可以添加 'd' 或 'f' 但逻辑有缺陷,因为 'F' 和 'D' 是有效的十六进制值。

不可能这样做:

double d = 0xAAAAAAAAAAAAAAAAAAd;

这只是 Java 不允许,还是有一种我不知道的简单方法?

【问题讨论】:

  • 你了解 IEEE-754 浮点格式吗?您是否研究过 Java 语言参考文档?你期望0xaaaaaaaaaaaaaaaa的浮点值是多少?
  • @JimGarrison:OP 说“不可能”,这表明他们确实尝试过并发现它给出了错误。在我开始回答这个问题之前,我自己并不知道 Java 中的浮点十六进制文字。
  • @JonSkeet 这很有趣....
  • @JimGarrison 是的,我研究过 java 文档,但我没有尝试这个具体案例,因为考试可能会问任何可能的问题,我也必须了解这一点。我有浮点格式的概念,但感谢 IEEE 参考。

标签: java hex literals


【解决方案1】:

事实证明它可能的,虽然这让我很吃惊。 Section 3.10.2 of the JLS 给出了浮点字面量的结构,包括HexadecimalFloatingPointLiteral

public class Test {

    public static void main(String[] args) {
        double d1 = 0xAAAAAAAAAAAAAAAAAAp0d;
        double d2 = 0x1.8p1d;

        System.out.println(d1); // A very big number
        System.out.println(d2); // 24 = 1.5 * 2^1
    }
}

p 是二进制指数的一部分 - p 之后的值是左移值的位数。其他例子:

0x1.4p0d => 1.25 (binary 0.01 shifted 0 bits)
0x8p-4d => 0.5 (binary 1000 shifted *right* 4 bits)

【讨论】:

  • 原来是一个相当难读的字面,但确实有可能!
  • C 有十六进制浮点常量,语法类似,在 C99 中添加。
  • @KeithThompson -- 是的,该语法最初被 C99 AFAICT 采用,然后迁移到 C 系列中的其他语言以及 Python 和其他一些语言。 (它们在需要按位精确 FP 值的低级数字代码中很有用。)
  • 如果不明显。十六进制浮点使用p(也许是“点”?)来引入指数(而不是用于十进制浮点的e),因为e也是一个十六进制数字。并且指数部分是强制性的,以避免与用于指示 float 类型常量的 f 后缀产生歧义。
  • 很好的答案。比吉姆加里森的电车抱怨更有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2020-02-09
相关资源
最近更新 更多