c-将同一个常数换成另一个常数会得到两个不同的答案



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

在这种特殊情况下,我试图将数字-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 

我不知道为什么左移在每一种情况下都有不同的表现。

这是未定义的行为,因为移位计数大于int的位数,这意味着无法预测结果。

当您对一个等于或大于其位数的数字进行移位时,结果是不可预测的!简单地说,它就是Undefined_abehavior。

如果你用标志编译你的程序,你会收到这个变化的的警告

最新更新