2

当我将 32 位无符号数添加到 32 位有符号数时,我希望进行以下检查:

  1. 如果结果是否定的,则将结果设置为 0 [楼层条件]
  2. 如果结果 >UINT_MAX,则将结果设置为 UINT_MAX [饱和条件]

实现这个的最干净/最佳的方法是什么?

4

3 回答 3

4

我建议将两者都转换为有符号的 64 位类型,执行加法,然后执行检查(可能使用min/ maxmacros/functions)。

于 2013-05-31T01:28:19.970 回答
1
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;
}
于 2013-05-31T01:45:04.120 回答
0

@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;
}
于 2013-05-31T02:37:26.920 回答