求助:关于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]