zoukankan      html  css  js  c++  java
  • 移位运算溢出:右操作数须小于左操作数的位数

    #include <stdio.h>
    
    int main(){
            int x = 1 << 32;
            int y = 32;
            int z = 1 << y;
            printf("x:%d, z: %d
    ", x, z);
    }

    以上运行结果: x:0, z: 1 

    汇编代码如下:

     1         .file   "tmp.c"
     2         .section        .rodata
     3 .LC0:
     4         .string "x:%d, z: %d
    "
     5         .text
     6         .globl  main
     7         .type   main, @function
     8 main:
     9 .LFB0:
    10         .cfi_startproc
    11         pushq   %rbp
    12         .cfi_def_cfa_offset 16
    13         .cfi_offset 6, -16
    14         movq    %rsp, %rbp
    15         .cfi_def_cfa_register 6
    16         subq    $16, %rsp
    17         movl    $0, -4(%rbp)            ; ?
    18         movl    $32, -8(%rbp)           ; y = 32;
    19         movl    -8(%rbp), %eax          ; $32 => %eax
    20         movl    $1, %edx                        ; $1 => %edx
    21         movl    %eax, %ecx                      ; $32 => %ecx
    22         sall    %cl, %edx                       ; 1 << 32
    23         movl    %edx, %eax                      ; (1 << 32) => %eax
    24         movl    %eax, -12(%rbp)         ; z
    25         movl    -12(%rbp), %edx         ; z => %edx
    26         movl    -4(%rbp), %eax          ; $0 => %eax
    27         movl    %eax, %esi
    28         movl    $.LC0, %edi
    29         movl    $0, %eax
    30         call    printf
    31         leave
    32         .cfi_def_cfa 7, 8
    33         ret
    34         .cfi_endproc
    35 .LFE0:
    36         .size   main, .-main
    37         .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-16)"
    38         .section        .note.GNU-stack,"",@progbits

    看汇编代码,  1 << 32 和 1 << y 明显是不一样的机制实现的, 虽然我也看不懂~~~


    这个问题也是在Stack Overflow上看到的,原文地址https://stackoverflow.com/questions/3871650/gcc-left-shift-overflow

  • 相关阅读:
    flex
    导航守卫 -vue
    H5 History
    JSX -react
    插槽slot -vue
    js 模拟鼠标绘制方块
    js 模拟滚动条
    js 实现简易留言板功能
    js 实现端口列表话
    js 为数组编写该方法;indexOf
  • 原文地址:https://www.cnblogs.com/fallenmoon/p/8890875.html
Copyright © 2011-2022 走看看