John Regehr的博客文章A Guide to Undefined Behavior in C and C++, Part 1包含以下“安全”函数,用于“执行整数除法而不执行未定义的行为”:

int32_t safe_div_int32_t (int32_t a, int32_t b) {
  if ((b == 0) || ((a == INT32_MIN) && (b == -1))) {
    report_integer_math_error();
    return 0;
  } else {
    return a / b;
  }
}

我想知道当a = INT32_MIN和b = -1时,除法(a/b)出了什么问题。它是未定义的吗?如果可以,为什么?

最佳答案

我认为这是因为INT32_MIN的绝对值比INT32_MAX大1。因此INT32_MIN/-1实际上等于INT32_MAX + 1,它将溢出。

因此,对于32位整数,有4,294,967,296个值。
负数有2,147,483,648个值(-2,147,483,648至-1)。
零(0)有1个值。
正数有2147483483647个值(1到2147483483647),因为0从正数中减去了1个值。

10-07 18:00
查看更多