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

Is INT_MIN subtracted from any integer considered undefined behavior?

本文关键字:任何 整数 未定义 MIN INT      更新时间:2023-10-16

如果我有这样的东西怎么办:

int a = 20;
int min = INT_MIN;
if(-a - min)
//do something

假设INT_MIN如果正数大于 INT_MAX.编译器是否会将 min 转换为类似 -min 的东西,如 -INT_MIN 中那样,这可能是未定义的?

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

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

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

x - y的结果定义为从x中减去y的数学结果。如果数学结果可以用结果类型表示(在本例中为int),则没有溢出。

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

x - y

x + (-y)

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

要回答标题中的问题:

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

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

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

相关文章: