两个整形相加,相乘(有检测溢出)

本文介绍了一种检测整数加法和乘法运算中溢出的方法,并通过示例程序验证了该方法的有效性。
#include <limits>
int Add(int a,int b,int &sum)
//返回-1为下溢,返回1为上溢,否则结果正确,sum返回结果a+b
{
   if ((a&0x80000000)==(b&0x80000000))
   {
      if ((a&0x80000000)==0x80000000)
      {
         if (b<INT_MIN-a)        
            return -1;        
      }
      else
      {
         if (INT_MAX-a<b)     
            return 1;      
      }
   }
   sum=a+b;
   return 0;   
}

 

 

 

//乘法

#include <limits>

#include<cassert>

using std::abs;

using namespace std;

static int  const  INT_MAX0= 65535;

static int const INT_MIN0 =-65535;

int Mul(int a,int b,int *iResult)

{

    if (a==0||b==0)

    {

       iResult=0;

       return 0;

    }

    if (a>0&&b>0||a<0&&b<0)

    {

       if ((INT_MAX0-abs(a)-1)/abs(a)+1<abs(b))

       {

           if(INT_MAX0/abs(a)==abs(b));

           else

           {

              return 1;

           }

       }     

    }

    else

    {  

       if((abs(INT_MIN0)-abs(a)-1)/abs(a)+1<abs(b))

       {

           if (abs(INT_MIN0)/abs(a)==abs(b))

           {

           }

           else

              return -1;

       }

    }

    *iResult=a*b;

    return 0;

}

//示例程序如下

 

int  main()

{

   

    for (int i=INT_MIN0;i<INT_MAX0;++i)

    {     

       for (int j=INT_MIN0;j<INT_MAX0;++j)

       {

           int iResult=0;

           if (Mul(i,j,&iResult)!=0)

           {  

              assert(i*j>INT_MAX0||i*j<INT_MIN0);                 

           }  

           else

           {

              assert(iResult<=INT_MAX0||iResult>=INT_MIN0);

           }

       }

    }

   return 0;

}

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值