#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;
}
csapp2e 家庭作业 2.73
最新推荐文章于 2022-04-18 21:46:00 发布