原文:http://www.mkyong.com/java/javas-silent-killer-buffer-overflow-careful/
不管你信不信,Java也有Integer overflow的问题。我不确定这个词儿是否是正确地描述这个问题的词儿,你也许可以给我一点建议
OK,看一下下面的程序。这个程序打印出每天有多少微妙数。
输出结果:public class Test {
public static void main(String[] args) {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
System.out.println("MICROS_PER_DAY : " + MICROS_PER_DAY);
}
}
MICROS_PER_DAY : 500654080
public class Test {
public static void main(String[] args) {
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
System.out.println("MICROS_PER_DAY : " + MICROS_PER_DAY);
}
}
输出结果:
MICROS_PER_DAY : 86400000000这回上面的程序输出了期望的结果86400000000。
结论
这个bug非常地难发现或被人们所知。如果有人在金融系统中犯了这样的错误,我真无法想像后果。我唯一的建议是当进行两个不同类型的原始类型运算时要显示地转型。 在任何运算中避免widening primitive conversion。