c 中 char相加问题

enihs 2007-11-09 08:12:45
#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;
}
最后一个为什么输出 fffffff8?
...全文
1081 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2007-11-10
  • 打赏
  • 举报
回复
一切源于你定义是个char类型的变量(有符号)
如果 你定义的是个unsigned char ,那就没什么问题了!
li8848li 2007-11-09
  • 打赏
  • 举报
回复

#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;
}


附:第三个printf的输出过程
124: 01111110
+124: 01111110
----------------
11111100 值为-8(f8),如果是4个字节,高位全补1,即得fffffff8
kojie_chen 2007-11-09
  • 打赏
  • 举报
回复
狂顶..
ttlyfast 2007-11-09
  • 打赏
  • 举报
回复
太晚喽~~~
睡觉6~~
--后后--
Zz~~
ttlyfast 2007-11-09
  • 打赏
  • 举报
回复
闲的没事 9给你讲讲8


#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;
}


前面怎么搞9不说拉 重点放在第2,3个printf上:


_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


我们看到:
最后一个输出fffffff8的原因是
0 printf的参数以整型为单位压栈(movl)
1 b = a+a 溢出成负数
2 对printf传递参数时把b符号扩展到了参数里所以%x打印出fffffff8

而第二个printf输出是f8的原因是
0 printf的参数以整型为单位压栈(movl)
1 寄存器eax对a+a的结果做了暂存由于eax是32位的所以中间结果未造成溢出中间结果为f8
2 对printf传递参数时把中间结果放到了参数里所以%x打印出f8

mymtom 2007-11-09
  • 打赏
  • 举报
回复
a + a运算时,升级到 int 进行运算。
星羽 2007-11-09
  • 打赏
  • 举报
回复

unsigned char a,b;
a=124;
b=a+a;
printf( "%x\n", a);
printf( "%x\n", a+a);
printf( "%x\n", b);
enihs 2007-11-09
  • 打赏
  • 举报
回复
那第二个为什么输出是f8呢,它也是%x占位啊
C1053710211 2007-11-09
  • 打赏
  • 举报
回复
我刚学这个,不知道对不对。
因为char是8个字节有符号的,b是124+124,先拿出124+4,就是128,使得最高位置一,
相当于是负数了,所以-128+剩下的120=-8(因为是补码的操作所以能加出这个结果,),
所以打印的结果是-8%128的结果,也就是fffffff8。
星羽 2007-11-09
  • 打赏
  • 举报
回复
那你想输出上面

%x 是按 32 位输出的,也就是 xxxxxxxx这样的格式

当数据小的时候,向高位扩展

124 +124 是 f8

扩展后就是 ff ff ff f8

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧