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的变量没有影响