c ++中间结果 - 未定义的行为

时间:2018-02-10 13:54:54

标签: c++

最近在处理我的项目时,我了解了中间结果。所以基本上它意味着如果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。后来我尝试了这段代码(见下图)并且有效 -

Modified code- correct 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;
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编译

1 个答案:

答案 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溢出未定义!