如果我有这样的事情怎么办:
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
假设 INT_MIN(如果为正)大于 INT_MAX。min 是否会被编译器转换为像 -INT_MIN 中的 -min 之类的东西,这可能是未定义的?
如果我有这样的事情怎么办:
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
假设 INT_MIN(如果为正)大于 INT_MAX。min 是否会被编译器转换为像 -INT_MIN 中的 -min 之类的东西,这可能是未定义的?
您是对的,应用到的一元减号INT_MIN
可以是未定义的,但在您的示例中不会发生这种情况。
-a - min
被解析为(-a) - min
。变量min
只涉及二进制减法,第一个操作数只需要严格为负即可定义结果。
如果编译器将减法转换为其他内容,则它有责任确保新版本始终计算与旧版本相同的内容。
的结果x - y
定义为从 中减去的数学y
结果x
。如果数学结果可以用结果类型表示(int
在这种情况下),那么就没有溢出。
编译器可以自由地以它喜欢的任何方式转换表达式,例如通过更改
x - y
至
x + (-y)
但前提是转换在原始行为明确定义的情况下保持相同的行为。在 的情况下y == INT_MIN
,只要未定义的评估行为-INT_MIN
产生相同的最终结果(它通常会),它仍然可以执行转换。
要回答标题中的问题:
是否从任何被视为未定义行为的整数中减去 INT_MIN?
INT_MIN - INT_MIN == 0
,并且不能溢出。
顺便说一句,我认为您的意思是int
“整数”而不是“整数”。int
只是几种整数类型之一。