在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
本例中,除法和算术右移的结果不存在不匹配的情况,但在实际应用中,当负数较大时,可能会出现不匹配的情况。 这种情况可以通过字操作来避免:
喜欢:
联合词
int16 HWord;
低字;
}一半;
}单词;
将所需值左移 16 位,然后取高 16 位,以避免算术右移操作。