【问题标题】:Questions on hexadecimal-notation for primitive initialization关于原始初始化的十六进制表示法的问题
【发布时间】:2014-01-11 09:48:00
【问题描述】:

我想使用十六进制符号直接初始化double。我知道这适用于intLong,如以下示例所示(结果值始终正确):

    int i   = 0x10000000;           // 268435456
    Long li = 0x1000000000000000L;  // 1152921504606846976

另一方面,如果我尝试对双打做同样的事情,它可以工作,但只能在 4 字节的范围内(查看代码示例中的 cmets)。对于第二个无效的表示法,Netbeans IDE 一直告诉我这是一个整数值,因此太大了:

    double d1 = 0x10000000;         // 2.68435456E8
    double d2 = 0x1000000000000000; // not valid

float-values 在 4 字节范围内工作得很好:

float f1 = 0x10000000;              // 2.68435456E8

  1. 有没有办法用十六进制表示法直接写入/初始化双精度数?
  2. 能够用十六进制表示法编写Long 的唯一原因是此表示法中没有“L”(与“f”表示浮点数或无效的“.”相反)用于标记双打)
  3. 为什么限制为 4 字节?为什么它适用于double 而不适用于Long

感谢您的建议和建议。

【问题讨论】:

    标签: java double hex


    【解决方案1】:

    Java 从 1.5 开始支持浮点十六进制文字

    double d = 0x1f.1p1;
    

    【讨论】:

    • 我不知道这种表示法。尽管如此,它仍然有效。我认为我最后一个问题的答案可能很简单:编译器只能将0x1000000000000000 评估为整数,因为没有什么可以告诉它在分配给double-变量之前它应该是什么。
    【解决方案2】:

    如果您只想使用长范围内的整数值初始化双精度,请使用:

    double d2 = 0x1000000000000000L;
    

    您还可以使用 BigInteger 提供长范围之外的整数十六进制值:

    double d3 = new BigInteger("123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0", 16).doubleValue();
    

    如果您需要提供十六进制分数,如上一个答案中所建议的,请使用十六进制浮点文字:

    double d = 0x1F.1p1;
    

    【讨论】:

    • 能否请您将 Evgeniy Dorofeev 的浮点十六进制文字添加到您的答案中,我将以您的帖子作为答案来结束这个问题。
    • 已完成,但也请支持 Evgeniy Dorofeev 的回答。
    猜你喜欢
    • 2015-04-18
    • 2016-02-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2012-02-14
    • 2013-04-05
    • 2015-05-07
    • 2013-07-22
    相关资源
    最近更新 更多