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个值。