INT_MIN/-1是否在C++中定义了行为?

Ear*_*rlz 2 c++ math integer-overflow integer-division

我有以下代码INT_MIN/-1.我希望这可能是INT_MAX + 1(或翻转时为0).但是,我得到的实际结果是INT_MIN.这是我的测试代码:

#define __STDC_LIMIT_MACROS
#include <stdint.h>
#include <stdio.h>
#include <limits.h>
using namespace std;
int main()
{
  int min=INT_MIN;
  int res=min/-1;
  printf("result: %i\n", res);
  printf("max: %i min: %i\n", INT_MAX, INT_MIN);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

此实现是特定的和/或未定义的行为吗?

And*_*owl 5

此实现是特定的和/或未定义的行为吗?

是的,有符号整数溢出是未定义的行为.根据C++ 11标准的第5/4段:

如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义.[...]

请注意,这同样不适用于无符号算术.如第3.9.1/4段和脚注46所述:

声明无符号的无符号整数应遵守算术模数的定律,2^n其中n是该特定整数大小的值表示中的位数.[...]

这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量为模.