我在C++中编写程序,求出a/e>>SUP>EM>B= EM>C,其中 a,B和C一起使用所有的数字0~9一次。该程序循环了a和b的值,并且每次在a、b和ab上运行一个数字计数例程,以检查数字条件是否满足
但是,当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 MIN或INT\u MAX