网站代优化,河南企业的网络推广,设计师服务平台网站,网站建设合同范文左移 无论被移动的数是有符号还是无符号#xff0c;左移一位相当于乘2(在不溢出的情形下) 右移 对于无符号数#xff0c;右移一位相当于除以2#xff1b; 对于有符号数#xff0c;如果还想获得同样右移除以2的效果#xff0c;就要考虑算数右移#xff0c;即符号位始终不变… 左移 无论被移动的数是有符号还是无符号左移一位相当于乘2(在不溢出的情形下) 右移 对于无符号数右移一位相当于除以2 对于有符号数如果还想获得同样右移除以2的效果就要考虑算数右移即符号位始终不变所有位(包括符号位)都向右移动一位这样造成的结果就是整数通过算数右移最终都会等于0(所有bit都是0)负数通过算数右移最终都会等于-1所有bit都是1)。 有符号算数右移与除法 有符号算数右移与对应的除法并不等价比如-1 / 2结果为0但是 -1 1结果仍位-1。其中的差别从汇编码可以看出来下面先贴出源码: int main() {int a -1;int b a / 2;int c a 1;
} 对应的汇编码 ; 1 : int main() {push ebpmov ebp, espsub esp, 12 ; 0000000cH; 2 : int a -1;mov DWORD PTR _a$[ebp], -1; 3 : int b a / 2;mov eax, DWORD PTR _a$[ebp]cdq ;将eax的最高bit位复制到edx寄存器sub eax, edxsar eax, 1 ;算数右移指令mov DWORD PTR _b$[ebp], eax; 4 : int c a 1;mov eax, DWORD PTR _a$[ebp]sar eax, 1mov DWORD PTR _c$[ebp], eax; 5 : } 从汇编码可以看到-1 / 2和-1 1的汇编码是不一样的。 转载于:https://www.cnblogs.com/chaoguo1234/p/5414554.html