设为首页 加入收藏

TOP

程序猿之---C语言细节7
2014-11-23 19:42:10 来源: 作者: 【 】 浏览:8
Tags:程序 ---C 语言 细节

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

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

输出:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇程序猿之---C语言细节5 下一篇程序猿之---C语言细节2

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: