我想在c中做左移位.
int a = 32;
printf("%d\n", ~0 << a);
printf("%d\n", ~0 << 32);
Run Code Online (Sandbox Code Playgroud)
所以我运行2个printf()以上,结果是不同的.我使用dev-C++.我不明白为什么不同.请帮我.
如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.
这是C标准.第二个你开始在32位宽的值上使用32位移位,所有的赌注都是关闭的.
什么是可能发生的是,编译器是常量折叠 ~0 << 32,因为这可以在编译时完全计算.
表达式~0 << a不能是常量折叠的(除非它是一个非常聪明的编译器,可以确定a永远是32).
这可能会导致任何差异,但说实话,标准中没有任何内容可以阻止程序擦除硬盘或在CPU中创建迷你黑洞(市场反应除外),因为未定义的行为是未定义的.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |