2013-06-18 37 views
2

我对INT_MIN/-1有以下代码。我期望这已经出来是INT_MAX + 1(或翻转0)。但是,我得到的实际结果是INT_MIN。这是我的测试代码:INT_MIN/-1是否在C++中定义了行为?

#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; 
} 

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

+0

签名溢出是不确定的,只有无符号的溢出定义为“模数'1个<< width'”。 – 2013-06-18 18:30:08

+0

“INT_MAX + 1”在滚动时不为0,它是“INT_MIN”。 – chris

+0

如果有符号整数的表示是“补码”或“有符号”的数量级,则会定义它的行为,因为不会发生溢出。 –

回答

5

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

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

如果表达式的评估过程中,其结果是不数学上或不在其类型 表示的值的范围限定,该行为是未定义。 [...]

请注意,这同样不适用于无符号的算术。段规定3.9.1/4和脚注46:

无符号整数,声明无符号,应当服从算术模2^n其中n是位在该特定大小的值表示的数目 的法律整数。 [012]

这意味着无符号算术不会溢出,因为不能由结果 无符号整数类型表示的结果以模数减少为大于可以由 生成无符号整数类型。

2

这是 Ensure that operations on signed integers do not result in overflow如何是伟大的符号整数溢出,因此不确定的行为,这Cert文件,据我可以告诉涵盖了所有的实例。这是从Division部分覆盖你的问题if声明:

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