强制转换 Java 长和双和总是给出相同的结果



请检查下面的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表示,但不能太大而不能用longdouble来表示。

通过使用+ 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);

最新更新