奇怪的是C左移位

时间:2013-04-24 03:57:05

标签: c bit-manipulation

我想在c中做左移位。

int a = 32;    
printf("%d\n", ~0 << a);    
printf("%d\n", ~0 << 32);    

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

2 个答案:

答案 0 :(得分:6)

  

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

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

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

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

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

答案 1 :(得分:0)

您可能(可能)将>=移位一个类型中的位数(在您正在使用的任何系统上,int可能是32位)。这是未定义的行为 - 允许编译器发出执行任何所需操作的代码。