乘以长值?

时间:2009-09-29 20:50:28

标签: java type-conversion

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;

是正确的

5 个答案:

答案 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
    }
}