铸造Java的长整数和两倍总得出相同的结果

问题描述 投票:2回答:2

请在下面的[[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中解释此行为

谢谢

java casting integer-overflow
2个回答
4
投票
start + d + end的值太大而无法用int表示,但是它也不会太大而无法由longdouble表示。

通过使用+ 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的大小的信息外,数字值,这可能导致结果值的符号与输入值的符号不同。

-1
投票
2147483647 = Integer.MAX_VALUE

尝试

double val = (double)(start + d + end + 0.0);

long val = (long)(start + d + end + 0.0);

© www.soinside.com 2019 - 2024. All rights reserved.