Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java long和double sum转换总是得到相同的结果_Java_Casting_Integer Overflow - Fatal编程技术网

将Java long和double sum转换总是得到相同的结果

将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

请检查以下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
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);