请在下面的[[Java代码下面进行检查:
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
。因此,总的来说,您正在将double
强制转换为int
。
[将太大的double
转换为int
会发生什么? Java Language Specification 5.1.3告诉您答案:
该值必须太大(正值较大或正无穷大,并且第一步的结果是int或long类型的最大可表示值。
但是,如果使用0
,则表达式start + d + end + 0
的类型仍为long
,因此您要将long
转换为int
,这是不同的转换。它是这样的:
将带符号整数缩小为整数类型T会简单地丢弃除n个最低阶位以外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关T的大小的信息外,数字值,这可能导致结果值的符号与输入值的符号不同。
尝试
double val = (double)(start + d + end + 0.0);
或
long val = (long)(start + d + end + 0.0);