如果我有这样的事情怎么办?
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
假设INT_MIN如果为正,则大于INT_MAX。编译器是否会将min转换为类似于-min的-INT_MIN,这可能是未定义的?
答案 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
只是几种整数类型中的一种。