编译器优化导致按位移位的奇怪行为

Compiler optimization causing strange behavior with bit-wise shifts

免责声明,这是关于移位溢出的,我知道它会导致未定义的行为;所以这真的不应该是一个问题。我问这个的原因是出于我的好奇心。

这是我的代码。

test.c:

#include <stdio.h>

void func(int val)
{
    int allOnes = 0xffffffff;

    printf("0x%x << 32  = 0x%x\n", allOnes, allOnes << 32);
    printf("0x%x << val = 0x%x\n", allOnes, allOnes << val);
}

int main()
{
    func(32);
}

当我 运行 没有编译器优化时 (gcc -O0 -Wall -g test.c -o test.o) 我得到以下结果。

0xffffffff << 32  = 0xffffffff
0xffffffff << val = 0xffffffff

但是,当我 运行 使用编译器优化 (gcc -O1 -Wall -g test.c -o test.o) 时,我得到以下结果。

0xffffffff << 32  = 0x0
0xffffffff << val = 0xffffffff

我的问题是:是什么原因造成的?

编辑:更具体地说,为什么 运行 编译器优化与不优化之间存在差异?

我做了一些挖掘,发现当您使用编译器优化 (-O1) 时,编译器会用它的 "result" 替换移位操作。在程序集中,有一个 mov edx, 0 而不是 shl edx, 32.

这里的差异只是由于处理器和编译器有不同的结果。毕竟是未定义的行为。