是c++中定义的INT_MIN/-1行为

Is INT_MIN/-1 defined behavior in C++?

本文关键字:MIN -1行 INT c++ 定义      更新时间:2023-10-16

我有以下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: %in", res);
  printf("max: %i min: %in", INT_MAX, INT_MIN);
  return 0;
}

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

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

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

如果在表达式求值期间,结果没有数学定义或不在的范围内对于可表示值的类型,其行为是未定义的。[…]

注意,同样的方法不适用于unsigned算术。如第3.9.1/4段和脚注46所述:

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

这意味着unsigned算术运算不会因为无法用结果表示的结果而溢出类所能表示的最大值大1的数的模化后的无符号整数类型生成的无符号整数类型。

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

if ( (sl2 == 0) || ( (sl1 == LONG_MIN) && (sl2 == -1) ) ) {
  /* Handle error condition */
}
else {
  result = sl1 / sl2;
}