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

本文探讨了C语言中负数右移位操作与除法移位的不同。当右移位后结果大于等于-1时,两种方法等效。但当结果小于-1时,直接移位会保留符号位,始终为-1,而除法移位会丢弃符号位,结果变为0。理解这两种方法的差异对于C语言编程至关重要,选择哪种方式取决于具体应用场景。
摘要由CSDN通过智能技术生成

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。具体采用哪种方法需要根据使用场合灵活应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值