Java 数值溢出
经常出现在用 int 类型计算时间戳时出现的问题,以下是计算 60 天的毫秒间隔时发现的问题和测试记录。
测试1,运算结果:
System.out.println(60 * 24 * 60 * 60 * 1000);
System.out.println(60 * 24 * 60 * 60 * 1000L);
运行结果:
889032704
5184000000
测试2,转换为二进制:
System.out.println(Long.toBinaryString(60 * 24 * 60 * 60 * 1000L));
System.out.println(Integer.toBinaryString(60 * 24 * 60 * 60 * 1000));
运行结果:
100110100111111011001000000000000
***110100111111011001000000000000
前面补了3个星号,比较容易看出第二个执行结果只取了后 31位。
这里其实取了32位,但是因为第一位是0省略了。