码迷,mamicode.com
首页 > 编程语言 > 详细

程序猿之---C语言细节7

时间:2014-11-04 00:15:00      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:整数相加溢出   检测溢出   c语言   

主要内容:检测两个整型相加是否溢出

#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;
}

输出:

bubuko.com,布布扣

程序猿之---C语言细节7

标签:整数相加溢出   检测溢出   c语言   

原文地址:http://blog.csdn.net/human_evolution/article/details/40753961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!