一个关于int值越界的问题

来源:互联网 发布:淘宝普拉松自动饮水器 编辑:程序博客网 时间:2024/04/28 08:44

一个关于int值越界的问题

在一个程序中突然爆出一个时间戳不是按照预设的按照天来增长的,有时间时间戳会跑到以前的一个日期,关于这个时间戳错乱的问题调试了好久,终于发现是int值越界的问题。

原始代码如下:

package test;public class Test1 {    public static void main(String[] args) {        for (int i = 0; i < 200; ++i ){            long ts = 1L + 3600 * 24 * 1000 * i;            System.out.println(ts);        }    }   }

测试结果如下:

1
86400001
172800001
……..
1814400001
1900800001
1987200001
2073600001
-2134967295
-2048567295
-1962167295
-1875767295
-1789367295
-1702967295
-1616567295

从上面的结果可以清晰的看出,int值 3600 * 24 * 1000 * i 会发生越界,因为Java的数字默认是int类型的,最大值为

2311
所以,当值超过这个最大值事会发生截断,变成一个负值。
Java编译器只会做静态的语法检查,当一个值显示的大于这个最大值时会报错,例如222222222222222222,但是当在计算表达式时,编译器是发现不了越界的,只有在运行的时候发生自动截断。
解决方法,把3600改为3600L即可。

1 1
原创粉丝点击