当我将 32 位无符号数添加到 32 位有符号数时,我希望进行以下检查:
- 如果结果是否定的,则将结果设置为 0 [楼层条件]
- 如果结果 >UINT_MAX,则将结果设置为 UINT_MAX [饱和条件]
实现这个的最干净/最佳的方法是什么?
当我将 32 位无符号数添加到 32 位有符号数时,我希望进行以下检查:
实现这个的最干净/最佳的方法是什么?
我建议将两者都转换为有符号的 64 位类型,执行加法,然后执行检查(可能使用min
/ max
macros/functions)。
uint32_t add_sat(uint32_t a, int32_t b) {
if (b < 0 && a < -(uint32_t)b) return 0;
if (b > 0 && a + b < a) return UINT32_MAX;
return a + b;
}
@OliCharlesworth ...这个怎么样?
unsigned int safe_add(long long a, long long b)
{
long long int result = (a + b);
if(result <= 0)
{
return 0;
}
if(result > UINT_MAX)
{
return UINT_MAX;
}
return result;
}