3

我有以下代码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;
}

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

4

2 回答 2

6

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

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

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

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

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

这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。

于 2013-06-18T18:29:22.340 回答
3

这是有符号整数溢出,因此是未定义的行为,这篇Cert关于如何确保对有符号整数的操作不会导致溢出的文档很棒,据我所知涵盖了所有实例。这是涵盖您的问题if的部分的声明:Division

if ( (sl2 == 0) || ( (sl1 == LONG_MIN) && (sl2 == -1) ) ) {
  /* Handle error condition */
}
else {
  result = sl1 / sl2;
}
于 2013-06-18T18:33:07.303 回答