码迷,mamicode.com
首页 > 其他好文 > 详细

左移运算的小题目

时间:2017-06-06 22:15:29      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:翻转   color   取数   unsigned   span   自己的   oid   再计算   寄存器   

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.

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

左移运算的小题目

标签:翻转   color   取数   unsigned   span   自己的   oid   再计算   寄存器   

原文地址:http://www.cnblogs.com/hinice/p/6953624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!