Java浮点数的十六进制表示方法

11

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


@marcog 这是一种表示浮点数的方式,详见JLS:http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.2 - Jesper
@marcogпјҡиҝҷжҳҜJavaе’ҢC99ж ҮеҮҶдёӯе®ҡд№үзҡ„еҚҒе…ӯиҝӣеҲ¶жө®зӮ№ж–Үеӯ—зҡ„жҢҮж•°ж Үи®°гҖӮ - Stephen Canon
2个回答

10
0x1e30x1e3d 是十六进制的整数字面量。请注意,ed 是十六进制数字,这里不是指数符号或者double类型标志。

1e3d 是一个十进制的浮点数字面量。 e 是指数符号,d 表示这是一个double而不是float

0x1p3 表示以十六进制方式表示浮点字面量的一种方法,您可以在Java语言规范的第3.10.2节中了解其含义。它意味着1乘以2的3次幂;指数是二进制(因此是2的幂而不是10的幂)。


但是在这种情况下,0x1p3应该和1e3相同,对吗?但是它们并不相同。 - serious
十六进制(hex)是人类构造的一种方式,帮助我们在不疯狂的情况下管理长字符串的位。在计算机中,它全部都是二进制 - 没有十六进制。请注意,一个二进制四位组(4位)直接映射到1个十六进制数字。因此,字节11010111变为(1101)(0111)= 0xD7。 - Tony Ennis
在0x1e3中没有指数。那是一个整数。 - Tony Ennis
我不知道为什么带有p-符号的指数是二进制的。这种表示法是Java从C或C++继承而来的。在事后很难找出为什么过去的某个人认为这将是一个有用的特性。 - Jesper
@serious,你把术语和表示混淆了。1e3d并不意味着3是十进制的。根据jesper的说法,它意味着该值是_double_。如果这不是你的意思,那么混淆可能是因为Java中的默认表示是十进制。所以1e3是10的3次方,即1000。0x1p3是8,因为0x表示“此表示是十六进制的”。十六进制浮点指数不使用'e'的原因可能是会导致歧义情况——'e'是一个有效的十六进制数字,而'p'不是。因此,'p'从不会引起歧义。 - Tony Ennis
显示剩余6条评论

2

0x1e3是十六进制的483,同样0x1e3d是十六进制的7741。这里的e被解释为十六进制数字14。


1
啊,0x1e3是一个十六进制数,所以这里的“e”不表示指数。 - serious
1
@serious,区别在于0x1e3是一个整数,而不是浮点数。该整数中的'e'只是一个不幸的巧合,容易引起混淆。0x1p3是一个浮点数。它的解释非常不同。解释包括一个“尾数”和一个“指数”。前者是1.0部分(请注意假定的小数点)。后者是“p3”部分,表示“3次方”。由于我们处于二进制状态,将一个数字提高到3次方等同于将其向左移动3位,因此0b1变为0b1000。这是十进制中的8。 - Tony Ennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接