将Java long和double sum转换总是得到相同的结果
请检查以下Java代码:将Java long和double sum转换总是得到相同的结果,java,casting,integer-overflow,Java,Casting,Integer Overflow,请检查以下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("val
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
max值。
如果我将0.0
更改为0
,则输出与预期一致
任何人都可以在Java
谢谢2147483647=Integer.MAX\u值 试一试 或者
start+d+end
的值太大,无法用int
表示,但它也不会太大,无法用long
或double
表示
通过使用+0.0
,您将开始+d+end+0.0
的整个表达式的类型设置为双精度
。因此,总体而言,您正在将一个double
转换为int
如果将太大的双精度转换为int
,会发生什么情况?答案如下:
该值必须太大(大数值的正值或正无穷大),并且第一步的结果是int或long类型的最大可表示值
但是,如果使用0
,表达式start+d+end+0
的类型仍然是long
,因此将long
转换为int
,这是一种不同的转换。事情是这样的:
有符号整数到整数类型T的缩小转换只会丢弃n个最低阶位以外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关数值大小的信息外,这可能导致结果值的符号与输入值的符号不同
感谢您的回答,我将检查缩小原语转换
规则。
double val = (double)(start + d + end + 0.0);
long val = (long)(start + d + end + 0.0);