关于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初始化为某个合理的值?