默认的情况下,右移的结果是向下取整的。比如,-3>>1, 移位的时候结果是 -2,而不是 -1;合理的结果应该是-1(取靠近0的整数值)。下面的代码展示了获得合理的结果的一个技巧:
#include <stdio.h>
int main(void)
{
int x = -12340;
double y = (double)(x) / 16;
int z = x >> 4;
int p = ( x < 0 ? x + ( 1 << 4) -1 : x ) >> 4;
printf("y: %.2f, z: %d, p:%d\n", y, z, p);
return 0;
}
结果:
y: -771.25, z: -772, p:-771
就是,如果 x < 0, 对它右移k位的时候,先加上 (1<< k) - 1, 然后再右移,就能获得期望的结果
依据的原理是:
参考CSAPP