将另一个常数换成另一个常数会产生两个不同的答案?

时间:2014-09-02 06:22:22

标签: c bit-manipulation bit-shift

我正在调试一些代码并遇到了一些我无法解释的行为。

我试图将数字-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 

我不确定为什么左移在每种情况下的表现都不同。

2 个答案:

答案 0 :(得分:3)

它是undefined behavior因为你的移位数大于int的位数,这意味着无法预测结果。

答案 1 :(得分:2)

当您移动一个等于或大于其位数的数字时,您的结果将无法预测!简单来说就是Undefined_behavior

如果您使用标记编译程序,您将收到有关此转换的警告