在很多场景中越界是个必不可少需要去判断的问题,算术运算的越界都会导致不可预知的错误和安全漏洞,同时也会出现不可预估的错误,所以越界判断尤为重要。下面程序只经过有限的测试,使用过程中如发生错误请提出修改。
以下返回值1代表越界,0代表正常
1.两个数相加是否越界(一个带符号一个不带符号,下同)
int tadd_ok(int x, int y)
{
return ((x<0 && y<0) && (x + y>0)) || ((x>0 && y>0) && (x + y<0));
}
int uadd_ok(unsigned int x, unsigned int y)
{
return !((x + y)>x && (x + y)>y);
}
如果是其他字长的数,应该只需改传参即可
2.减法
int tsub_ok(int x, int y)
{
return tadd_ok(x, -y);
}
int usub_ok(unsigned int x, unsigned int y)
{
return x < y;
}
3.乘法
int umul_ok(unsigned int x, unsigned int y)
{
unsigned int p = x * y;
return !x || p/x==y;
}
int tmul_ok(int x, int y)
{
#if 1
int p = x * y;
return !x || p / x == y;
#else
return umul_ok(x, y);
#endif
}
参考:C语言怎样判断乘法越界,如何判断C语言算术运算的越界问题_weixin_39699121的博客-CSDN博客
C语言怎样判断乘法越界,如何判断C语言算术运算的越界问题_weixin_39699121的博客-CSDN博客



