2

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

int a = 20;
int min = INT_MIN;

if(-a - min)
//do something

假设 INT_MIN(如果为正)大于 INT_MAX。min 是否会被编译器转换为像 -INT_MIN 中的 -min 之类的东西,这可能是未定义的?

4

2 回答 2

2

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

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

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

于 2013-09-25T21:24:37.660 回答
1

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

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

x - y

x + (-y)

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

要回答标题中的问题:

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

INT_MIN - INT_MIN == 0,并且不能溢出。

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

于 2013-09-25T21:51:14.240 回答