public class LongDivision {
public static void main(String[] args) {
final long a = 24 * 60 * 60 * 1000 * 1000;
final long b = 24 * 60 * 60 * 1000;
System.out.println(a/b);
}
}
此代码块的输出为:5为什么结果为5?
答案 0 :(得分:3)
您的每个因素都是int
,并且乘法会溢出。即使您已将结果声明为long
,但中间产品全部为int
,因为它们的因素为int
s。
如果您将第一个因素声明为long
(使用后缀L
),它将按预期工作:
public static void main(String[] args) {
final long a = 24L * 60 * 60 * 1000 * 1000;
final long b = 24L * 60 * 60 * 1000;
System.out.println(a/b);
}
答案 1 :(得分:1)
24 * 60 * 60 * 1000 * 1000
溢出并导致500654080
而不是预期的86400000000
。
24L * 60 * 60 * 1000 * 1000
按预期工作。
答案 2 :(得分:0)
24*60*60*1000*1000 = 86,400,000,000
。在Binary中,它是0001 0100 0001 1101 1101 0111 0110 0000 0000 0000
。由于文字值是整数类型,因此只会采用32 LSB。溢出将被丢弃。因此值为0001 1101 1101 0111 0110 0000 0000 0000
,小数为500,654,080
。所以这将是你的价值。您的b值为86,400,000
。没有溢出。所以现在500,654,080/86,400,000 = 5
就是你得到的。
如果您想要正确解决问题,请将第一个文字声明为long
,以便
a = 24L * 60 * 60 * 1000 * 1000
会给你预期的输出。