我正在调试一些代码并遇到了一些我无法解释的行为。
我试图将数字-1向左移动32次,以在这种特殊情况下产生零。
int n = 0;
int negOne = ~0;
int negativeN = ( (~n) + 1 );
int toShift = (32 + negativeN); //32 - n
/*HELP!!! These produce two different answers*/
printf("%d << %d = %d \n",negOne, toShift, negOne << toShift);
printf("-1 << 32 = %d \n", -1 << 32) ;
以下是控制台输出的内容:
-1 << 32 = -1
-1 << 32 = 0
我不确定为什么左移在每种情况下的表现都不同。
答案 0 :(得分:3)
它是undefined behavior因为你的移位数大于int
的位数,这意味着无法预测结果。
答案 1 :(得分:2)
当您移动一个等于或大于其位数的数字时,您的结果将无法预测!简单来说就是Undefined_behavior。
如果您使用标记编译程序,您将收到有关此转换的警告