深入理解计算机系统 2.73

本文介绍了一个使用C语言实现的饱和加法函数,该函数能够处理整数加法中的溢出问题,当发生正溢出时输出TMax,负溢出时输出Tmin。通过几个具体的示例展示了如何使用该函数并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




2
345678910111213141516171819202122232425262728293031323334
转自:https://github.com/darrenhp/Practise/blob/master/csapp/ch02/2_73.c
加法处理,正溢出输出TMax,负溢出输出Tmin.
#include<stdio.h>
#include<limits.h>

int saturating_add(int x, int y)
{
int mask = INT_MIN;
int sum = x + y;
int w = (sizeof(int)<<3)-1;
int tmin = ( ((x&mask)&&(y&mask)&&!(sum&mask)) << w >> w ) & INT_MIN;
int tmax = ( ((~x&mask)&&(~y&mask)&&(sum&mask)) << w >> w) & INT_MAX;
return (sum& ~(!(tmin|tmax))) | tmin | tmax;
}

void show_saturating_add(int x, int y)
{
printf("saturating_add(0x%08X, 0x%08X) = 0x%08X:%d\n",
x, y, saturating_add(x, y), saturating_add(x, y) );
printf("%d + %d = %d\n", x, y, x+y);
printf(" \n");
}


int main()
{
show_saturating_add(0xFFFFFFFF, 0x80000000);
show_saturating_add(0xFFFFFFFF, 0xFFFFFFFF);
show_saturating_add(0x7FFFFFF0, 0x0000000F);
show_saturating_add(0x7FFFFFF5, 0x0000000F);
show_saturating_add(0x55555555, 0x55555555);
show_saturating_add(0x55555555, 0x33333333);
show_saturating_add(0x55555555, 0x23333333);
show_saturating_add(0x55555555, 0x2FFFFFFF);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值