请检查下面的JavaCode:
public class Test{
public static void main(String []args){
long start = 1572544800000L;
long end = 1635703200000L;
int d = 10;
int val = (int)(start + d + end + 0.0);
// value 2147483647
System.out.println("value: " + val);
}
}
在这里,如果我更改d
的值,则输出始终2147483647
相同。 这是Int
最大值。 如果我将0.0
更改为0
则输出符合预期。
任何人都可以用Java
来解释这种行为
谢谢
start + d + end
的值太大而不能用int
表示,但不能太大而不能用long
或double
来表示。
通过使用+ 0.0
,你正在使start + d + end + 0.0
的整个表达式的类型double
。所以总的来说,你正在向int
投下double
.
将太大的double
转换为int
时会发生什么?Java 语言规范 5.1.3 告诉你答案:
该值必须太大(大量级或正无穷大的正值(,并且第一步的结果是 int 或 long 类型的最大可表示值。
但是,如果使用0
,表达式start + d + end + 0
的类型仍然是long
,因此您将long
转换为int
,这是一种不同的转换。它发生的方式是这样的:
将有符号整数缩小到整数类型 T 的转换只是丢弃除 n 个最低顺序位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值量级的信息外,这还可能导致结果值的符号与输入值的符号不同。
2147483647 = Integer.MAX_VALUE
尝试
double val = (double)(start + d + end + 0.0);
或
long val = (long)(start + d + end + 0.0);