将值放入变量时发生移位奇怪的行为

bit shift strange behavior when put value in a variable

#include <stdio.h>

int main()
{
    int e = 100;
    printf("%x %x \n", 1<<(100), 1<<e);
    printf("%x %x \n", 0xffffff<<(100-23), 0xffffff<<(e-23));

}

输出

main.c:14:25: warning: left shift count >= width of type [-Wshift-count-overflow]
     printf("%x %x \n", 1<<(100), 1<<e);
                         ^~
main.c:15:32: warning: left shift count >= width of type [-Wshift-count-overflow]
     printf("%x %x \n", 0xffffff<<(100-23), 0xffffff<<(e-23));
                                ^~
0 10 
0 ffffe000 

我不知道为什么会这样,谁能给我解释一下?我认为两者都应该是 0,但是编译器在那里做了什么?

引用自 reference 的位移运算符:

In any case, if the value of the right operand is negative or is greater or equal to the number of bits in the promoted left operand, the behavior is undefined.

在您的例子中,您的左操作数是 int 类型,最有可能 32 位大小。您将其移动的幅度远不止于此,因此会出现警告(以及随后的未定义行为)。

在。结果不可预测。