c语言无符号整型 一直累加 溢出_程序猿之---C语言细节7(检测两个整型相加是否溢出)...

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

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

}

输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值