【发布时间】:2013-06-18 18:28:19
【问题描述】:
我有以下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;
}
此实现是特定的和/或未定义的行为吗?
【问题讨论】:
-
有符号溢出未定义,只有无符号溢出定义为“模
1 << width”。 -
INT_MAX + 1在翻转时不是 0,而是INT_MIN。 -
如果有符号整数的表示是一个的补码或有符号的大小,这是定义的行为,因为这样就不会发生溢出。
-
@DanielFischer 这不可能。如果是真的,那么可以使用反码将整个文档存储在单个
int中。 -
@wizzwizz4 对不起,我不明白你的意思。以防万一:在我的评论中,我的意思是
INT_MIN/-1是在一个补码或有符号幅度表示中定义的行为(因为这样数学结果也可以表示为int)。
标签: c++ math integer-overflow integer-division