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