我想在c中做左移位。
int a = 32;
printf("%d\n", ~0 << a);
printf("%d\n", ~0 << 32);
所以我运行2个printf()以上,结果是不同的。我使用dev-C ++。我不明白为什么不同。请帮我。
答案 0 :(得分:6)
如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。
这是来自C标准。第二个你开始在32位宽的值上使用32位移位,所有的赌注都关闭。
可能发生的是编译器常量折叠 ~0 << 32
,因为这可以在编译时完全计算。
表达式~0 << a
不能是常量折叠的(除非它是一个非常聪明的编译器,可以确定a
将始终为32)。
这可能会造成任何差异,但说实话,标准中没有任何内容可以阻止程序擦除硬盘或在CPU中创建迷你黑洞(除了市场反应),因为未定义的行为是,undefined。
答案 1 :(得分:0)
您可能(可能)将>=
移位一个类型中的位数(在您正在使用的任何系统上,int
可能是32位)。这是未定义的行为 - 允许编译器发出执行任何所需操作的代码。