奇怪的是C左移位

-2 c bit-manipulation

我想在c中做左移位.

int a = 32;    
printf("%d\n", ~0 << a);    
printf("%d\n", ~0 << 32);    
Run Code Online (Sandbox Code Playgroud)

所以我运行2个printf()以上,结果是不同的.我使用dev-C++.我不明白为什么不同.请帮我.

pax*_*blo 6

如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.

这是C标准.第二个你开始在32位宽的值上使用32位移位,所有的赌注都是关闭的.

什么是可能发生的是,编译器是常量折叠 ~0 << 32,因为这可以在编译时完全计算.

表达式~0 << a不能是常量折叠的(除非它是一个非常聪明的编译器,可以确定a永远是32).

这可能会导致任何差异,但说实话,标准中没有任何内容可以阻止程序擦除硬盘或在CPU中创建迷你黑洞(市场反应除外),因为未定义的行为是未定义的.