- 错误代码如下
autoCloseAlarmTime在noe的基础上加了720h,打印结果却比noe小
public static void main(String[] args) {
Integer continueTime=720;
Integer conTime= Optional.ofNullable(continueTime).orElse(0);
long noe=System.currentTimeMillis();
Long autoCloseAlarmTime = conTime * 60 * 60 * 1000 + noe;
System.out.println(noe);
System.out.println(autoCloseAlarmTime);
}
/**
* 打印结果
* 1719891601043
* 1718188633747
* 请分析autoCloseAlarmTime在noe的基础上加了720h,打印结果却比noe小
*/
- 原因分析
在Java中,当整数相乘的结果超出整数的表示范围时,会发生溢出,导致了计算结果的不正确。
在Java中,整数的表示范围取决于使用的数据类型。常见的整数数据类型及其取值范围如下:
- byte:8位有符号整数,范围为 -128 到 127。
- short:16位有符号整数,范围为 -32,768 到 32,767。
- int:32位有符号整数,范围为 -2,147,483,648 到 2,147,483,647。
- long:64位有符号整数,范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
当整数超出这些范围时,就会发生整数溢出。整数溢出会导致结果不正确,因为整数类型有固定的位数,无法表示超出其范围的值。
代码中,当计算 conTime * 60 * 60 * 1000 时,如果 conTime 的值较大,乘积可能会超出 int 类型的表示范围,导致溢出。为了避免这种情况,可以将中间结果转换为 long 类型,以扩大表示范围。
- 正确代码
public static void main(String[] args) {
Integer continueTime = 720;
Integer conTime = Optional.ofNullable(continueTime).orElse(0);
long noe = System.currentTimeMillis();
long autoCloseAlarmTime = conTime.longValue()* 60 * 60 * 1000 + noe;
System.out.println(noe);
System.out.println(autoCloseAlarmTime);
}