C++ 表达式不是';计算不正确

C++ 表达式不是';计算不正确,c++,overflow,C++,Overflow,我编写的这段代码正确地计算了所有内容,直到出现以下特定数字: #include <cmath> int n1 = 187972 ; int n2 = 12026 ; double a = 0.002 ; int partial = round((n1*n2)*a) ; int result = n1 - partial ; #包括 int n1=187972; int n2=12026; 双a=0.002; int部分=圆形((n1*n2)*a); int结果=n1-部分; 程

我编写的这段代码正确地计算了所有内容,直到出现以下特定数字:

#include <cmath>

int n1 = 187972 ;
int n2 = 12026 ;
double a = 0.002 ;
int partial = round((n1*n2)*a) ;
int result = n1 - partial ;
#包括
int n1=187972;
int n2=12026;
双a=0.002;
int部分=圆形((n1*n2)*a);
int结果=n1-部分;

程序返回的结果是4256804,这是完全错误的。我想我弄错了,但我看不出是怎么回事。

正如评论中所建议的那样,结果是正确的,因为n1*n2溢出了int max值,因此溢出产生了一个负数

实际上
-2034416024

这里是ideone,您可以验证

一个解决方案是使用长数字来代替

#include
#include <cmath>

int n1 = 187972 ;
int n2 = 12026 ;
double a = 0.002 ;
long long partial = round((n1*n2)*a) ;   // new
long long result = n1 - partial ;   // new
int n1=187972; int n2=12026; 双a=0.002; 长部分=圆形((n1*n2)*a);//新的 长结果=n1-部分;//新的
看起来像
n1*n2
溢出
int
2260551272
2147483647
(又称
int\u MAX
)注意,有几种方法可以避免溢出:我不确定“正确”是什么意思。溢出
int
是UB。不需要环绕(至少在c++20 iirc之前)。