整数运算溢出检查

整数的加法、减法和乘法溢出判断

用c语言实现整数的加法、减法和乘法的溢出判断。
必要知识:
1. 在C语言中,对于任意整数值x,-x=~x+1;
2. 以32位机器为例,整型int的最小值 TMIN= 0x80000000.

/* Determine whether arguments can be added without overflow. */
/* If overflow, return 0 (otherwise 1)*/
int tadd_ok(int x, int y)
{
    int sum = x+y;
    int neg_over = x<0 && y<0 && sum>=0;
    int pos_over = x>0 && y>0 && sum<0;
    return !neg_over && !pos_over;
}

/* Determine whether arguments can be subtracted without overflow.*/
/* If overflow, return 0 (otherwise 1)*/
int tsub_ok(int x, int y)
{
    if(y == ~y+1)  // y == -y
        return x<0;
    else
        return tadd_ok(x, -y);
}
注意:当y=TMIN=0x80000000时,-y=0x80000000并不是正的整数,所以此时不适用tadd_ok(x,-y).
证明:TMIN==-TIMIN. 
     -TIMIN = ~TMIN+1 = ~0x80000000+1 = 0x7FFFFFFF+1 = 0x80000000 = TMIN.


/* Determine whether arguments can be multiplied without overflow.*/
/* If overflow, return 0 (otherwise 1)*/
int tmult_ok(int x, int y)
{
    int p = x*y;
    return !x || p/x==y;
}

练习题:对于数据类型int为32的情况,设计一个版本的tmult_ok函数,要使用64位精度的数据类型long long,而不使用除法。

答案:
int tmult_ok(int x, int y)
{
    /*Compute product without overflow*/
    long long pll = (long long) x*y;
    /*See if casting to int preserves value*/
    return pll == (int )pll;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值