csapp2e 家庭作业 2.73

#include<limits.h>

int saturating_add(int x,int y)
{
	int sum = x + y;
int w = sizeof(int) << 3;
	int x_sign = x >> (w - 1); // 取出x的符号位
	int y_sign = y >> (w - 1); // 取出y的符号位
	int sum_sign = sum >> (w - 1);//取出sum的符号位
	int pos_overflow = x_sign && y_sign && !sum_sign; //判断正溢
	int neg_overflow = !x_sign && !y_sign && sum_sign;//判断负溢
	int overflow = pos_overflow || neg_overflow;//设置溢出位
	overflow <<= w - 1;
	overflow >>= w - 1; 						//将溢出位设置为全0 或 全 1
	int result = (sum & ~overflow ) + ((INT_MAX + !pos_overflow) & overflow); //根据是否溢出进行二路选择  INT_MAX = 0x7fffffff(32位机器) \
																	INT_MAX + 1 = 0X80000000 = INT_MIN
	return result;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值