70,022
社区成员




#include "stdio.h "
int main()
{
char a,b;
a=124;
b=a+a;
printf( "%x\n ",a); //这个理解应该没问题
printf( "%x\n ",a+a); //这个为f8,原因是a+a的计算结果为int,值为248,所以输出十六进制数为f8
printf( "%x\n ",b); //这个b因为是char(1个字节),b=a+a后溢出,值为-8。如果你的编译器给int分配4个字节,那么输出就是fffffff8
return 0;
}
#include "stdio.h "
int main()
{
char a,b;
a=124;
b=a+a;
printf( "%x\n ",a);
printf( "%x\n ",a+a);
printf( "%x\n ",b);
return 0;
}
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
movb $124, -1(%ebp) //a=124;
movzbl -1(%ebp), %eax
addb -1(%ebp), %al //b=a+a;(溢出为f8)
movb %al, -2(%ebp) //-2(%ebp)存储b(f8)
movsbl -1(%ebp),%eax
movl %eax, 4(%esp) //传递参数a, a为7c
movl $LC0, (%esp)
call _printf //第一个 printf
movsbl -1(%ebp),%eax //把a给eax 符号扩展后a仍然为7c
addl %eax, %eax //a+a 放到eax并未造成溢出
movl %eax, 4(%esp) //传递参数a+a
movl $LC0, (%esp) //传递参数格式化字符串"%x\12 \0"
call _printf //第二个printf
movsbl -2(%ebp),%eax //把b符号扩展到eax
movl %eax, 4(%esp) //传递参数b,符号扩展,参数的值为FFFFFFF8
movl $LC0, (%esp) //传递参数格式化字符串"%x\12 \0"
call _printf //第三个printf
movl $0, %eax
unsigned char a,b;
a=124;
b=a+a;
printf( "%x\n", a);
printf( "%x\n", a+a);
printf( "%x\n", b);