汇编下才能看出区别的问题
2016-03-14 11:48
204 查看
int main() { unsigned char a = 0xff; char b = 0xff; int c = (a==b); printf("c = %d\n",c); return 0; }
这段代码执行的时候,得到的结果是
c = 0
有点出乎意料哈。GCC在编译的时候对于位宽不足32位/64位的有符号和无符号的变量赋值,采用的mov指令是不一样的。有符号数用movsbl/movswl/movslq,符号位会扩展。无符号数采用movzbl/movzwl/movzlq,符号位不会扩展。在执行比较指令到时候,用的是32位的cmpl指令。因此,被扩展的符号位就造成了差异。
main: pushl %ebp movl %esp, %ebp subl $16, %esp movb $-1, -1(%ebp) movb $-1, -2(%ebp) movzbl -1(%ebp), %edx movsbl -2(%ebp),%eax cmpl %eax, %edx sete %al movzbl %al, %eax movl %eax, -8(%ebp) movl -8(%ebp), %eax leave ret
在32位系统上对于32bit的变量和在64位系统上对于64bit的变量没有影响
相关文章推荐
- android基础的回顾(一)开发工具的转变---android studio
- leetcode 283. Move Zeroes
- iOS NSInvocation用法简介
- PHP实现异步调用方法研究
- Python--控制语句
- 每个程序员都该了解的开源世界
- [Offer收割]编程练习赛2 hihocoder 1275 扫地机器人 (计算几何+模拟 比较烦)
- Ubuntu Sublime
- 正确使用Android性能分析工具——TraceView
- 中南民航如何利用K2BPM构建业务流程?
- 打印十字图
- 嵌入式jetty的HTTP实现
- 在线生成CSS样式和兼容的字体格式
- ReactiveCocoa代码实践之-RAC网络请求重构
- Python爬虫--捕捉网易首页
- 正则表达式
- 2016蓝桥杯假期任务之《邮局》
- ViewPager的用法(2)——ViewPager配合PagerTabStrip的使用
- 机器学习模型的评价
- iOS软件检查更新,每次启动检测Appstore是否有更新,每一次更新只提醒一次