-2

我正在尝试在 c 中进行左移位。

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

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

4

2 回答 2

6

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

那是来自C标准。在您开始对 32 位宽的值使用 32 位移位的那一刻,所有的赌注都被取消了。

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

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

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

于 2013-04-24T03:59:45.730 回答
0

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

于 2013-04-24T04:01:35.843 回答