关于Java中溢出的混淆

关于Java中溢出的混淆,java,c++,c,Java,C++,C,我有以下声明: long result = a * b * c; 这会导致变量结果溢出。而且: long result = (long)a * b * c; 但当故障发生时,它们不会: long result = a; result *= b; result *= c; a和b的类型为int 有人能解释一下为什么会这样吗?在前两种情况下,Java是否将中间结果存储在临时内部int变量中 也有C和C++的行为方式相同吗?p> 一元数的优先级高于乘法,因此(长)a*b*c是(长)(a)*b*c

我有以下声明:

long result = a * b * c;
这会导致变量结果溢出。而且:

long result = (long)a * b * c;
但当故障发生时,它们不会:

long result = a;
result *= b;
result *= c;
a和b的类型为
int

有人能解释一下为什么会这样吗?在前两种情况下,Java是否将中间结果存储在临时内部int变量中

也有C和C++的行为方式相同吗?

p> 一元数的优先级高于乘法,因此

(长)a*b*c
(长)(a)*b*c

我也是

我刚刚测试了这些程序:

public class JavaApplication2 {
    public static void main(String[] args) {
        long l = (long)Integer.MAX_VALUE;
        l *= 2;
        l *= 2;
        System.out.println(l);
    }
}

它们显示出完全相同的输出

相反,如果在第二个版本中删除强制转换,则会出现溢出。

请参阅

一元数的优先级高于乘法,因此
(长)a*b*c
(长)(a)*b*c

我也是

我刚刚测试了这些程序:

public class JavaApplication2 {
    public static void main(String[] args) {
        long l = (long)Integer.MAX_VALUE;
        l *= 2;
        l *= 2;
        System.out.println(l);
    }
}

它们显示出完全相同的输出


相反,在第二个版本中删除强制转换,则会出现溢出。

假设
a*b*c
适合
long
,但
a*b
不适合
int
-

  • 您的第一个代码段出现溢出,因为正如您所怀疑的那样,
    a*b
    进入了临时的
    int
  • 您的第二个代码段并没有像您声称的那样产生溢出,因为它在每个点上乘以
    long
  • 您的第三个代码段不会产生溢出,因为它还在每个点上乘以
    long

和,是的,C和C++都是这样工作的;尽管根据平台的不同,它们可能具有不同长度的

int
long

假设
a*b*c
适合
long
,但
a*b
不适合
int
-

  • 您的第一个代码段出现溢出,因为正如您所怀疑的那样,
    a*b
    进入了临时的
    int
  • 您的第二个代码段并没有像您声称的那样产生溢出,因为它在每个点上乘以
    long
  • 您的第三个代码段不会产生溢出,因为它还在每个点上乘以
    long

和,是的,C和C++都是这样工作的;尽管取决于平台,但它们的

int
long
长度可能不同

什么类型的
a
b
c
int
s?请不要使用太多的

标签;当它们存在时,很难修复格式。是的,a、b、c是ints@Doorknob好啊下次会记住这一点。:)对于您提供的代码片段,我没有得到相同的结果。它构建、运行并给出预期结果。当然,我假设您已经将a、b和c初始化为某个合理的值?什么类型是
a
b
c
int
s?请不要使用太多的

标签;当它们存在时,很难修复格式。是的,a、b、c是ints@Doorknob好啊下次会记住这一点。:)对于您提供的代码片段,我没有得到相同的结果。它构建、运行并给出预期结果。当然,我假设你已经将a,b&c初始化为某个合理的值?