C++中间结果-未定义行为

C++中间结果-未定义行为,c++,C++,最近在我的项目中,我了解了中间结果。基本上这意味着,如果int*int,那么结果就是int- 输出-t=1107970048-哪个错误 正如预期的那样,表达式n*x2中出现了溢出,我通过将n&x2变量更改为long int来修复它。后来我尝试了这段代码(见下图),它成功了- 输出-t=888681381120000-哪个是正确的 我的问题是,为什么表达式n*x2在上述程序中没有导致溢出。 使用g++7.3编译在n*x2-x*x中有一个双溢出 1 n*x2溢出到106618304,因为正确的结果

最近在我的项目中,我了解了中间结果。基本上这意味着,如果int*int,那么结果就是int-

输出-t=1107970048-哪个错误

正如预期的那样,表达式n*x2中出现了溢出,我通过将n&x2变量更改为long int来修复它。后来我尝试了这段代码(见下图),它成功了-

输出-t=888681381120000-哪个是正确的

我的问题是,为什么表达式n*x2在上述程序中没有导致溢出。
使用g++7.3编译在n*x2-x*x中有一个双溢出

1 n*x2溢出到106618304,因为正确的结果4401585600没有找到无符号整数

2那么你有: 106618304 - 3499905600. 同样,正确的结果-3393287296不适合无符号整数,因此溢出到901680000

有趣的是,如果根本没有发生溢出(例如,如果所有变量都是long int类型),那么901680000将是正确的结果


请注意,unsigned int的溢出不是未定义的行为-它是完全定义的。有符号整数溢出未定义

请将您的代码作为实际代码而不是图像共享,请参阅meta了解原因。对不起,我已按照您所说的修改了我的问题。为什么会出现溢出?结果值适合32位无符号整数。您认为溢出应该如何表现?两个代码段是相同的!?因为51*86305600=4401585600,而unsigned int可以保存最大值4294967295。如果我尝试这个表达式-无符号整数n=51,x2=86305600;长整数t=n*x2;然后它飞越Thanx很多@Flopp,我从来没有这样想过:-p。顺便问一下,你能告诉我,当在无符号整数中存储负值和超出范围的值(例如-3499905600)时,如何计算溢出值,而无需编程求解它吗?
#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;
}
#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;
}