赞
踩
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位来避免算术右移操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。