您的位置:首页 > 编程语言 > C语言/C++

程序员---C语言细节7(增加两个整数溢出检测)

2015-10-14 09:41 302 查看

主要内容:增加两个整数溢出检测

#include <stdio.h>
#include <limits.h>
int main(int argc, char *argv[])
{
/*
*  a和b为非负整型变量,检測a+b是否会“溢出”
*/
// INT_MAX=2147483647
int a=123456789,b=2147483000;

/*
方法一:
if(a+b < 0)
printf("overflow\n");

错误原因:在某些机器上。加法运算将设置内部寄存器为四种状态正、负、零和溢出。
在这样的机器上c编译器有理由这样来检測 。a与b相加,然后检查内部寄存器的相关标志是否
为负。然而当溢出发生时。内部寄存器状态是溢出而不是负,那么溢出检測就会失败
*/
/*
*  正确方法为:
法一、将a和b都强制转换成无符号整数;(原因:由于假设不转的话两个数,假设相加结果
是大于INT_MAX的话在放入32寄存器中时是有符号的,符号位被置1了。变成负数,这样就不可能
大于INT_MAX了,即检測不出来了)
*/
#if 1
if((unsigned)a + (unsigned)b > INT_MAX) // (unsigned)不可缺少,INT_MAX在limits.h中定义,假设没有则自己实现
{										// INT_MAX=2147483647
printf("overflow\n");
}
#else
/*
法二、
*/
if(a > INT_MAX - b)    // 写成这个形式就能够不用(unsigned)了
{
printf("overflow\n");
}
#endif
return 0;
}


输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: