在Java中将整数字面量赋值给双精度变量

5
如果我执行以下操作:
double d = 0;

由于0是一个使用32位的整型字面量,而d是一个使用64位的双精度变量,剩余的32位是否会被填充随机垃圾,或者Java是否正确地提升了字面量?


这很容易检查,不是吗? - yurib
3
几次测试跑不应该被依赖,因为如果没有指定,行为可能会因实现而异。 - user684934
1
d 中的位将对应于零的 double 表示。你似乎认为 d 的前 32 位将与零的 int 表示中的 32 位相同,但这不一定是正确的。 - Chris Taylor
2个回答

11

Java做出了正确的推断,否则将会有相当数量的代码存在问题 :-)

Java语言规范第5.1.2节详细说明了这一点:

原始类型的以下19种特定转换被称为扩展原始类型转换:

byte to short, int, long, float, or double
short to int, long, float, or double
char to int, long, float, or double
int to long, float, or double
long to float or double
float to double 
将基本类型进行扩展转换不会丢失数字值的总体大小信息。确实,从一种整数类型到另一种整数类型或者从浮点数到双精度类型的扩展转换都不会丢失任何信息,数字值完全得以保留。在strictfp表达式中,从float到double的扩展转换也可以完全保留数字值;但是,这样的非strictfp转换可能会丢失有关转换值总体大小的信息。
将int或long值转换为float或将long值转换为double可能会导致精度损失,即结果可能会丢失一些最低有效位的值。在这种情况下,使用IEEE 754舍入到最近模式,得到的浮点值将是整数值的正确舍入版本。
在Java中,从32位的int类型到具有50多位精度的double类型的转换不会丢失数量级或任何精度。如果由于其值而将常量强制转换为long,则可能会失去精度,因为long具有64位精度。

1

Java会自动将double类型转换为integer类型,即向上转型。因此,内存由JVM自动管理。
但是它无法自动将double类型转换为integer类型,即向下转型。


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