首页 > 代码库 > 左移运算的小题目

左移运算的小题目

int main(void)
{
    unsigned char a = 0xa5;
    unsigned char b;
    
    b = ~a >> 1+2+3;
    
    return 0;
}

通过查看汇编的过程发现了自己的理解的错误,计算机是把整个EAX寄存器全部翻转的。最后再截取数据

   0x00000000004004d6 <+0>:    push   %rbp
   0x00000000004004d7 <+1>:    mov    %rsp,%rbp
   0x00000000004004da <+4>:    movb   $0xa5,-0x2(%rbp)
   0x00000000004004de <+8>:    movzbl -0x2(%rbp),%eax    ;eax = 0x000000a5
   0x00000000004004e2 <+12>:    not    %eax          ;eax = 0xffffff5a
=> 0x00000000004004e4 <+14>:    sar    $0x6,%eax       ;eax = 0xfffffffd
   0x00000000004004e7 <+17>:    mov    %al,-0x1(%rbp)     ;al = 0xfd
   0x00000000004004ea <+20>:    mov    $0x0,%eax
   0x00000000004004ef <+25>:    pop    %rbp
   0x00000000004004f0 <+26>:    retq  

  先是计算not,再计算sar.

  在不清楚顺序的时候最好使用括弧,切记

左移运算的小题目