如何检测无符号整数乘法溢出?

我在C++中编写程序,求出a/e>>SUP>EM>B= EM>C,其中 aBC一起使用所有的数字0~9一次。该程序循环了ab的值,并且每次在abab上运行一个数字计数例程,以检查数字条件是否满足

但是,当ab溢出整数限制时,可能会生成虚假解。最后,我使用如下代码检查此问题:

无符号长b、c、c_测试;
...
c_测试=c*b;//可能溢出
如果(c_test/b!=c){/*出现溢出*/}
else c=c_测试;//无溢出

是否有更好的溢出测试方法?我知道一些芯片有一个内部标志,当溢出发生时,它被设置,但是我从来没有见过它通过C或C++访问。


请注意,有符号溢出在C和C++中是未定义的行为,因此您必须在不实际导致溢出的情况下检测它。有关添加之前的有符号整数溢出,请参见在C/C++中检测有符号溢出

我知道你用的是无符号整数。根据定义,在C中(我不了解C++),无符号算术不会溢出。。。所以,至少对于C来说,你的观点是没有意义的:)

对于有符号整数,一旦出现溢出,就会出现未定义行为(UB),您的程序可以执行任何操作(例如:使测试不确定)

#包括<极限h>
int a=<某物>;
int x=<某物>;
a+=x;/*乌兰巴托*/
如果(a<0){/*不可靠测试*/
/* ... */
}

要创建一致性程序,您需要在生成所述溢出之前测试溢出。该方法也可用于无符号整数:

//用于添加
#包括<极限h>
int a=<某物>;
int x=<某物>;
如果((x>0)&(a>INT_MAX-x))/*`a+x`将溢出*;
如果((x<0)和(a<INT_MIN-x))/*`a+x`将下溢*;

//用于减法
#包括<极限h>
int a=<某物>;
int x=<某物>;
如果((x<0)&(a>INT_MAX+x))/*`a-x`将溢出*/;
如果((x>0)&(a<INT_MIN+x))/*`a-x`将下溢*;

//用于乘法
#包括<极限h>
int a=<某物>;
int x=<某物>;
//可能需要为两个的补码机器检查-1。
//如果一个数字是-1,另一个是INT_MIN,乘以它们我们得到的abs(INT_MIN)比INT_MAX高1
如果((a=-1)和(x==INT_MIN))/*`a*x`可以溢出*/
if((x=-1)&(a==INT\u MIN))/*`a*x`(或`a/x`)可能溢出*/
//一般情况
如果(a>INT_MAX/x)/*`a*x`将溢出*/;
如果((a<INT_MIN/x))/*`a*x`会下溢*/;

对于除法(除INT\u MIN-1特殊情况外),不可能超过INT\u MININT\u MAX

发表评论