#include<stdio.h>
void main()
{
int w = sizeof(int) * 8;
int k = 0;
printf("%x\n", w);
printf("%x\n", (1 << (32 - 0)) - 1);
printf("%x\n", (1 << (w - k)) - 1);
}
上述代码,运行结果如下图所示
为什么用字母和数字分别对1进行左移32操作得到的结果不一样?
#include<stdio.h>
void main()
{
int w = sizeof(int) * 8;
int k = 0;
printf("%x\n", w);
printf("%x\n", (1 << (32 - 0)) - 1);
printf("%x\n", (1 << (w - k)) - 1);
}
上述代码,运行结果如下图所示
为什么用字母和数字分别对1进行左移32操作得到的结果不一样?
只能这样解释
printf("%x\n", (1 << (32 - 0)) - 1);
这个地方1 << (32 - 0)) - 1经过了编译器优化,是常数,结果直接嵌入代码。编译器计算(对于溢出),和运行时计算,不一样。
我的编译器有一个 warning: left shift count >= width of type [enabled by default]