我正在编写一些C代码来查看整数的位表示.在此过程中,我发现了基于优化设置返回不同结果的代码.我只是做错了什么,或者这是一个编译器错误?
这是代码:
#include <stdio.h>
int test(int x, int n)
{
int TMin_n = -(1 << (n-1));
int TMax_n = (1 << (n-1)) - 1;
return x >= TMin_n && x <= TMax_n;
}
int main(){
int x = 0x80000000;
int n = 0x20;
if(test(x,n)){
printf("passes\n");
}
else{
printf("fails\n");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样编译它,我得到一个传递结果
$ gcc tester.c -o tester
$ ./tester
passes
Run Code Online (Sandbox Code Playgroud)
如果我这样编译它会得到一个失败的结果
$ gcc -O1 tester.c -o tester
$ ./tester
fails
Run Code Online (Sandbox Code Playgroud)
问题是
x <= TMax_n
Run Code Online (Sandbox Code Playgroud)
仅在优化的情况下评估为false.
这是我的平台详细信息:
$ gcc --version
Configured with: …Run Code Online (Sandbox Code Playgroud)