如果我执行以下操作:
double d = 0;
由于0是一个使用32位的整型字面量,而d是一个使用64位的双精度变量,剩余的32位是否会被填充随机垃圾,或者Java是否正确地提升了字面量?
double d = 0;
由于0是一个使用32位的整型字面量,而d是一个使用64位的双精度变量,剩余的32位是否会被填充随机垃圾,或者Java是否正确地提升了字面量?
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转换可能会丢失有关转换值总体大小的信息。Java会自动将double类型转换为integer类型,即向上转型。因此,内存由JVM自动管理。
但是它无法自动将double类型转换为integer类型,即向下转型。
d
中的位将对应于零的double
表示。你似乎认为d
的前 32 位将与零的int
表示中的 32 位相同,但这不一定是正确的。 - Chris Taylor