如果我有这样的东西怎么办:
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
只是几种整数类型之一。