最近在处理我的项目时,我了解了中间结果。所以基本上它意味着如果int * int那么结果是int。所以我原来的代码是 - Original Code- Wrong result
#include<iostream>
int main()
{
unsigned int x,y,xy,x2,y2,n;
long int t1,t2,t;
x=59160;
y=7560;
xy=8185320;
x2=86305600;
y2=1139984;
n=51;
t=((n * x2) - (x * x))*((n * y2) - (y * y));
std::cout << "t=" << t << "\n";
return 0;
}
输出 - “t = 1107970048” - 这是错误的
现在正如预期的那样,表达式n * x2出现溢出,我通过更改n&amp; x2变量为long int。后来我尝试了这段代码(见下图)并且有效 -
#include<iostream>
int main()
{
unsigned int x,y,xy,x2,y2,n;
long int t1,t2,t;
x=59160;
y=7560;
xy=8185320;
x2=86305600;
y2=1139984;
n=51;
t1=(n * x2) - (x * x);
t2=(n * y2) - (y * y);
t=t1*t2;
std::cout << "t=" << t << "\n";
return 0;
}
输出 - “t = 888681381120000” - 这是正确的
我的问题是,为什么表达式n * x2不会导致上述程序溢出。 使用g ++ 7.3编译
答案 0 :(得分:0)
(n * x2) - (x * x)
中有双重溢出!
(1)n * x2
溢出到106618304
(因为正确的结果4401585600
没有伪造成unsigned int
)。
(2)然后你有:
106618304 - 3499905600
。
同样,正确的结果-3393287296
不适合unsigned int
,因此溢出到901680000
。
如果没有发生任何溢出(例如,如果所有变量都是901680000
类型的话),那么long int
就会得到正确的结果。
请注意unsigned int
的溢出不未定义的行为 - 它是完美定义的。 signed int
溢出未定义!