如何避免溢出变量的乘法?

时间:2014-12-29 14:32:02

标签: java

如果我有以下代码:

long interval = 0;
interval = ((6000 * 60) * 24) * 30;

它不会运行,因为我需要将每个文字都设为Long。所以这会奏效:

interval = ((6000L * 60L) * 24L) * 30L;

但是如果我试图将char类型中的不同变量相乘呢?说我有:

char a, b, c, d;

我给这些字符中的每个字符赋值,所以我尝试:

interval = a * b * c * d;

如果这个溢出,我不能只放L,因为那会调用不同的变量。

interval = aL * bL * cL * dL;

我已尝试将这些字符中的每一个转换为很长时间,但该产品仍会返回负数。

3 个答案:

答案 0 :(得分:3)

您只需将其中一个变量(任何一个)转换为long,以便进行long乘法运算:

interval = (long)a * b * c * d;

答案 1 :(得分:2)

interval = ((6000L * 60L) * 24L) * 30L;

此代码似乎在计算30天内的毫秒数。

那么,请使用JDK提供的功能:

interval = TimeUnit.DAYS.toMillis(30L);

javadoc for TimeUnit

答案 2 :(得分:1)

multiplicative operator应用于其操作数时,

  

对操作数执行二进制数字提升(第5.6.2节)。

就这种情况而言,

  

否则,如果任一操作数的类型为long,则另一个操作数将转换为long

所以,真的,你需要的只是在乘法开始时有一个long值。您可以通过几种方式实现这一目标。 Either use a cast as demonstrated by Eran.或在表达式

中使用long字面值
char a, b, c, d;
...
interval = 1L * a * b * c * d;
//        (......) result is a long value

通过乘法的开头,我指的是乘法运算符是左关联的这一事实。在您的示例中,如果第一次应用*的结果为long值,则会传播到下一个*