Java中long类型除法出现意外结果:为何输出为5?
为什么这段Java代码输出结果是5?
嘿,这个问题我太熟了!本质上就是整数溢出在搞鬼,咱们一步步拆解来看:
Java里的整数字面量默认是
int类型:你看代码里的24、60、1000这些数字,没有加L后缀,所以它们都是int。计算a和b的时候,一开始的乘法运算都是在int的范围内进行的,直到最后才把结果转成long——但这时候已经晚了!计算
a时发生了溢出:咱们算一下24 * 60 * 60 * 1000 * 1000的实际值是86400000000,但int的最大值只有2^31-1(也就是2147483647),这个结果远远超出了int的范围。根据Java的规则,有符号整数溢出后会循环绕回,最终得到的错误值是500654080,然后这个值被赋值给了long类型的a。计算
b时没有溢出:24 * 60 * 60 * 1000的结果是86400000,这个数小于int的最大值,所以运算正常,b得到了正确的86400000L。最后除法的结果:用错误的
a值(500654080)除以正确的b值(86400000),整数除法会舍去小数部分,500654080 / 86400000 = 5,这就是你看到的输出结果。
如果想要得到正确的结果(1000),只需要把其中一个数字改成long类型就行,比如把第一个数写成24L,这样整个乘法运算就会以long的精度进行,不会发生溢出:
final long a = 24L * 60 * 60 * 1000 * 1000; final long b = 24 * 60 * 60 * 1000; System.out.println(a/b); // 输出1000
内容的提问来源于stack exchange,提问作者yasin
相关产品推荐
相关产品推荐

