(x<y)==(-x>-y) 是真还是假?

ems*_*msa 3 c gcc system

该问题来自 cs:app3e 2.82。我了解到,当x = INT_MIN,-x也是-INT_MIN,但是

#include <stdio.h>
#include <limits.h>

int main() {
    int x = INT_MIN, y = -3;
    printf("%d\n", (x < y) == (-x > -y));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上(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来编译它。

Sha*_*ger 14

在您的平台上,像许多其他平台一样(任何使用补码而没有陷阱表示的平台,这是最现代的平台),求反INT_MIN是未定义的行为。编译器可以假设未定义的行为不会发生,并且可以按照自己喜欢的方式进行操作,包括在发生这种情况时以无意义的方式进行操作。因此,gcc的优化器(无论优化设置如何,仍以最低级别运行)可以INT_MIN在分析 时排除 的可能性(x<y)==(-x>-y),并得出结论,它是同义反复,在1不执行任何运行时比较的情况下进行替换。事实上,它不执行任何运行时比较,它只是1直接加载以进行打印。