我正在调试一些代码,遇到了一些无法解释的行为。
在这种特殊情况下,我试图将数字-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。
如果你用标志编译你的程序,你会收到这个变化的的警告