32位无符号和32位有符号数之间的相加

时间:2013-05-31 01:24:49

标签: c

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

  1. 如果结果为负,请将结果设置为0 [Floor Condition]
  2. 如果结果为> UINT_MAX,请将结果设置为UINT_MAX [饱和条件]
  3. 实现这一目标的最干净/最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

我建议将两者都转换为带符号的64位类型,执行添加,然后执行检查(可能使用min / max宏/函数。)

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}