您的位置:首页 > 其它

汇编下才能看出区别的问题

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的变量没有影响
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: