class Main {
public static void main (String[] args){
long value = 1024 * 1024 * 1024 * 80;
System.out.println(Long.MAX_VALUE);
System.out.println(value);
}
}
输出是:
9223372036854775807 0
long value = 1024 * 1024 * 1024 * 80L;
!
答案 0 :(得分:40)
在Java中,所有数学都是以处理所有当前值所需的最大数据类型完成的。所以,如果你有int * int,它总是将数学作为一个整数,但是int * long是一个长整数。
在这种情况下,1024 * 1024 * 1024 * 80作为Int完成,它溢出int。
“L”当然强制其中一个操作数为Int-64(long),因此所有数学运算都将值存储为Long,因此不会发生溢出。
答案 1 :(得分:4)
整数文字是int
s。 int
s溢出。使用L
后缀。
long value = 1024L * 1024L * 1024L * 80L;
如果数据来自变量,则预先投射或分配给long。
long value = (long)a * (long)b;
long aL = a;
long bL = b;
long value = aL*bL
严格地说,你可以减少足够的时间,但最好是明确的。
也不能将作为后缀的小写l
混淆为1
。
答案 2 :(得分:1)
我怀疑这是因为默认情况下,java将文字视为整数,而不是长整数。因此,如果没有L on 80,则乘法会溢出。
答案 3 :(得分:1)
此代码:
long value = 1024 * 1024 * 1024 * 80;
将一些整数相乘,将其转换为long,然后将结果赋值给变量。实际的乘法将由javac而不是在运行时完成。
由于int是32位,因此值被包装并导致零。
正如你所说,在右侧使用长值会产生一个结果,只有超过64位才会包装。
答案 4 :(得分:1)
如果我理解正确,根据您的要求,您希望将这些值乘以1024 * 1024 * 1024 * 80;
在计算器中,我看到值为1024 * 1024 * 1024 * 80 = 85899345920。
这里是你的java代码:这些是java中的货币价值计算
import java.math.BigDecimal;
public class Demo {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("1024");
BigDecimal bd2 = new BigDecimal("1024");
BigDecimal bd3 = new BigDecimal("1024");
BigDecimal bd4 = new BigDecimal("80");
BigDecimal bd5 = bd1.multiply(bd2).multiply(bd3).multiply(bd4);
System.out.println(bd5); // output comes: 85899345920
}
}