【问题标题】:Java floating-point numbers representation as a hexadecimal numbersJava 浮点数表示为十六进制数
【发布时间】:2011-05-31 14:22:01
【问题描述】:

为什么0x1p3 等于8.0?为什么0x1e3 等于483,而0x1e3d 等于7741?这很令人困惑,因为 1e3d 等于 1000.0

【问题讨论】:

标签: java floating-point hex


【解决方案1】:

0x1e30x1e3d 是十六进制的 integer 文字。请注意,ed 是十六进制数字,在这种情况下不是指数指示符或 double 类型指示符。

1e3d 是一个十进制 浮点 文字。 e 是指数指标,d 表示这是 double 而不是 float

符号0x1p3 是一种用十六进制表示浮点文字的方法,您可以在Java 语言规范的section 3.10.2 中阅读。表示 1 乘以 2 的 3 次方;指数是二进制的(因此,它是 2 次方而不是 10 次方)。

【讨论】:

  • 但是在这种情况下 0x1p3 应该和 1e3 一样,对吧?但他们不是。
  • @serious 不,因为指数是二进制的,而不是十进制的。它的 2^3 不是 10^3。
  • 顺便说一句,它是二进制的有什么原因吗?我的意思是,为什么它不是 16 的基数?
  • Base 16(十六进制)是一种人工构造,可帮助我们管理长串位而不会发疯。在计算机中,它都是二进制的——没有十六进制。请注意,一个二进制 nybble(4 位)直接映射到 1 个十六进制数字。所以字节 11010111 变为 (1101)(0111) = 0xD7。
  • 是的,但在 1e3 表示法中,指数是十进制的。
【解决方案2】:

0x1e3 是 483 的十六进制,0x1e3d 是 7741 的十六进制。e 被读取为值为 14 的十六进制数字。

【讨论】:

  • 啊,0x1e3 是一个十六进制数,所以这里的“e”不代表指数。
  • @serious,区别在于 0x1e3 是整数,不是浮点数。该整数中的“e”只是一个令人困惑的不幸巧合。 0x1p3 是一个浮点数。它的解释非常不同。解释包括一个尾数和一个指数。前者是 1.0 部分(注意假定的小数点。)后者是“p3”部分,读作“3 次方”。由于我们是二进制的,所以将一个数字的 3 次方与将其向左移动 3 位相同,因此 0b1 变为 0b1000。这是十进制的 8。
猜你喜欢
  • 2023-04-06
  • 2014-03-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2013-07-14
  • 2022-01-05
  • 2010-12-08
相关资源
最近更新 更多