C学习:隐藏在负数移位过程中的bug

C学习:隐藏在负数移位过程中的bug

问题


负数移位时,你是否了解以下两条语句的区别?

  • a /= (1 << bit)
  • a >>= bit

分析


  • 若右移位后结果>=-1,第一种方法移位与第二种方法移位相同,本质相当于除法。
  • 若右移位后结果<-1,则有所区别:第一种方***保留符号位,不管怎么右移一直保持符号位,结果为-1;第二种方***丢弃符号位,结果为0;

验证代码如下,可尝试将MOVE_BIT修改为4、3、2查看效果:

#define MOVE_BIT 4

int i = -8;
i >>= MOVE_BIT;
printf("i = %d\n", i);

int j = -8;
j /= (1 << MOVE_BIT);
printf("j = %d\n", j);

总结


总而言之,直接移位会保留符号位,负数不断右移变大,最大也只能是-1,不能到0,除法移位则会舍弃符号位,右移放大至0。具体采用哪种方法需要根据使用场合灵活应用。

C语言世界 文章被收录于专栏

C语言学习总结分享

全部评论

相关推荐

SadnessAlex:跟三十五岁原则一样,人太多给这些***惯坏了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务