编译器优化导致按位移位的奇怪行为
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
.
这里的差异只是由于处理器和编译器有不同的结果。毕竟是未定义的行为。
免责声明,这是关于移位溢出的,我知道它会导致未定义的行为;所以这真的不应该是一个问题。我问这个的原因是出于我的好奇心。
这是我的代码。
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
.
这里的差异只是由于处理器和编译器有不同的结果。毕竟是未定义的行为。