左移与右移

左移

  无论被移动的数是有符号还是无符号,左移一位相当于乘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    ebp
    mov    ebp, esp
    sub    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, edx
    sar    eax, 1   ;算数右移指令
    mov    DWORD PTR _b$[ebp], eax

; 4    :     int c = a >> 1;

    mov    eax, DWORD PTR _a$[ebp]
    sar    eax, 1
    mov    DWORD PTR _c$[ebp], eax

; 5    : }

从汇编码可以看到,-1 / 2和-1 >> 1的汇编码是不一样的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值