问题来自于cs:app3e 2.82。
我了解到当x = INT_MIN时,-x也是-INT_MIN,但是
在我的机器上(Linux版本6.2.0-34-generic(buildd@bos03-amd64-059)(x86_64-linux-gnu-gcc-11(Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0,GNU ld(GNU Binutils for Ubuntu)2.38)),这会输出1。 为什么会发生这种情况?
我使用gcc -o进行编译。 我还使用gcc -O0进行编译。
#include <stdio.h>
#include <limits.h>
int main() {
int x = INT_MIN, y = -3;
printf("%d\n", (x < y) == (-x > -y));
return 0;
}
在我的机器上(Linux版本6.2.0-34-generic(buildd@bos03-amd64-059)(x86_64-linux-gnu-gcc-11(Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0,GNU ld(GNU Binutils for Ubuntu)2.38)),这会输出1。 为什么会发生这种情况?
我使用gcc -o进行编译。 我还使用gcc -O0进行编译。
-INT_MIN
是未定义行为。请参考:https://stackoverflow.com/questions/71081310/why-does-int-min-int-min-and-how-the-negative-sign-operate-in-bit-level#comment125653666_71081600 - undefinedx = INT_MIN
时,-x
也是-INT_MIN
"_并不完全正确,因为可能存在其他人所描述的未定义行为。但是,除了1
以外,你对于(x < y) == (-x > -y)
的结果还期望什么呢?也许我需要喝咖啡.... - undefined-fwrapv
来获得你期望的行为,或者使用-fsanitize=undefined
来获得解释。 - undefined-fwrapv
)。半相关:GCC在x86-64与AArch64上对-x>-y
的优化不同:C程序'(-x > -y)'在macOS和Linux上的输出不同-原因和如何修复。 - undefined