从任何被认为是未定义行为的整数中减去INT_MIN吗?

时间:2013-09-25 21:22:03

标签: c++ undefined-behavior integer-overflow

如果我有这样的事情怎么办?

int a = 20;
int min = INT_MIN;

if(-a - min)
//do something

假设INT_MIN如果为正,则大于INT_MAX。编译器是否会将min转换为类似于-min的-INT_MIN,这可能是未定义的?

2 个答案:

答案 0 :(得分:2)

你是对的,可以不定义应用于INT_MIN的一元减号,但在你的例子中不会发生这种情况。

-a - min被解析为(-a) - min。变量min仅涉及二进制减法,第一个操作数只需要对要定义的结果严格为负。

如果编译器将减法转换为其他内容,则有责任确保新版本始终与旧版本计算相同的内容。

答案 1 :(得分:1)

x - y的结果定义为从y减去x的数学结果。如果数学结果可以在结果类型中表示(在这种情况下为int),那么就没有溢出。

编译器可以自由地以任何方式转换表达式,例如通过更改

x - y

x + (-y)

如果转换在原始行为定义良好的情况下保持相同的行为。在y == INT_MIN的情况下,只要评估-INT_MIN的未定义行为产生相同的最终结果(它通常会这样),它仍然可以执行转换。

回答标题中的问题:

  

从任何被视为未定义行为的整数中减去INT_MIN吗?

INT_MIN - INT_MIN == 0,并且无法溢出。

顺便说一下,我认为你的意思是int而不是“整数”。 int只是几种整数类型中的一种。