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位来避免算术右移 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)