代码如下:
- #include <stdio.h>
- int main()
- {
- int i = 1;
- i <<= 32;
- printf("i = %d \n", i);
- return 0;
- }
编译与运行:
- $gcc test.c -o test
- $test
- 1
在32位机器上,这个结果是错误。因为在32位机器上如果1左移32就变成0了。在优化版的结果是正确的。
优化的编译与运行:
- $gcc test.c -o test
- $test
- 0
接着分析:
转换成asm
转化出来为:
- .file "t4.c"
- .section .rodata
- .LC0:
- .string "%d \n"
- .text
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- andl $-16, %esp
- subl $32, %esp
- movl $1, 28(%esp)
- movl $32, %ecx
- sall %cl, 28(%esp)
- movl $.LC0, %eax
- movl 28(%esp), %edx
- movl %edx, 4(%esp)
- movl %eax, (%esp)
- call printf
- movl $0, %eax
- leave
- ret
- .size main, .-main
- .ident "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
- .section .note.GNU-stack,"",@progbits
优化的转换成asm
- .file "t4.c"
- .section .rodata.str1.1,"aMS",@progbits,1
- .LC0:
- .string "%d \n"
- .text
- .p2align 4,,15
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- andl $-16, %esp
- subl $16, %esp
- movl $0, 4(%esp)
- movl $.LC0, (%esp)
- call printf
- xorl %eax, %eax
- leave
- ret
- .size main, .-main
- .ident "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
- .section .note.GNU-stack,"",@progbits
其中最主要的区别是,没有优化的有sall,而优化过的没有。看看sall指令到底是怎么做的就了了。
在试试其他的数字,比如说31,33等,结果让我想起大学学习《计算机组成原理与接口》时,见过循环位移和算术位移。可以这么理解在没有优化的结果是循环位移。
优化的结果是算术位移。
I need job. please call me.
search guowei1651,file3,np10.
阅读(4449) | 评论(0) | 转发(2) |