C语言中关于移位操作注意事项

序言

C语言尤其是嵌入式开发过程中总是容易遇到对于整型数进行乘除操作的情况,众所周知,在计算机二元世界中,移位操作作为算术移位执行速度相较于乘除数学符号运算较快,尽管两种方式最后的结果是一致的。

正文

此处有个需要特别注意的地方:
在移位操作中,若进行左移操作,则不关乎被移位操作对象是否为负数。
在移位操作中,若进行右移操作,若直接右移操作,则产生的结果有可能与直接除法运算结果不匹配。
**对于负数算术右移操作计算原理步骤具体为:
1、对负数绝对值数值进行二进制表示。
2、在二进制表示后最高位添加1来表示负号
3、将新组合二进制数符号位保持不变,原码转换为反码+1(负数在内存中是以补码形式存在)得到补码
4、对此补码进行右移操作,右移N位,则左边高位补N个1
5、对新得到的二进制表示转换为反码
6、对反码进行+1 **
例:-5>>2
(1)-5的绝对值为5,二进制表示为101
(2)对高位补1,表示负号,则二进制表示为1101
(3)符号位保持不变,其余取反码得1010
(4)对反码+1得补码为1011
(5)算术右移两位得1110(右移两位,左边补2个1)
(6)进行反码得1001
(7)对反码+1得补码为1010
(8)即结果为-2
此事例并未出现除法与算术右移结果不匹配的情况,但实际应用中当负数数字较大时是有可能出现的,此种情况可通过字操作来避免:
如:
typedef union word
{
struct
{
int16 HWord;
uint16 LWord;
}half;
}WORD;
将所求数值左移16位,然后取高16位来避免算术右移操作。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值