3

请查看Oracle 规范 - 第 5 章

这一行:

加宽基元转换不会丢失有关数值整体大小的信息。

紧随其后的是下面两行,这条线表示幅度信息可能会丢失。

从 float 到 double 的扩展原始转换不是 strictfp 可能会丢失有关转换值的整体大小的信息。

这似乎是一个明显的矛盾。这是一个错误吗?

4

3 回答 3

3

是的,它确实。来自甲骨文:

嗨,比尔,

感谢您的邮件。我同意两者之间存在矛盾:

“扩大的原始转换不会丢失有关数值整体大小的信息。”

和:

“从 float 到 double 的扩展原始转换不是 strictfp 可能会丢失有关转换值整体大小的信息。”

在引入 strictfp 之前,只有第一句话出现在 JLS 的第一版中。第二句出现在 JLS 的第二版中,作为 strictfp 支持的一部分,第一句应该同时进行了修改。在 Java SE 8 版本中,我将澄清只有一些扩展的原始转换不会丢失幅度信息。

于 2013-10-11T12:48:51.613 回答
2

值得一提的是,JVM 规范在2.11.4中的措辞更加清晰:

扩大数值转换不会丢失有关数值整体大小的信息。实际上,从 int 扩大到 long 和从 int 扩大到 double 的转换根本不会丢失任何信息;数值被完全保留。FP-strict(第 2.8.2 节)从 float 扩大到 double 的转换也完全保留了数值;但是,这种非 FP 严格的转换可能会丢失有关转换值整体大小的信息。

于 2013-10-01T16:14:41.253 回答
1

这更像是一个澄清。在浮点到双精度转换的特定情况下,除非指定了strictfp ,否则无法保证不会丢失信息

于 2013-10-01T13:28:21.503 回答