[求助]问一个vc下unsigned char和char区别的问题

FridayRU 2012-07-14 12:36:19
环境是vc++
#include<stdio.h>
void main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c;
c = a+b;
printf("%d %d\n",a+b,c);
}

输出是300 44
问一下为什么printf里面相加结果就不一样了啊?

然后我把a、b、c换成了char型的
#include<stdio.h>
void main()
{
char a = 200;
char b = 100;
char c;
c = a+b;
printf("%d %d\n",a+b,c);
}
输出就是44 44
问一下各位大虾,为什么会有这样的差别啊。。。
...全文
272 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
sorry,第二个回答错误了。
应该是:
char a = 200; 与下面的句子是一样的。
char a = -56;
a+b当整数运算,结果必须是44.

第一个unsigned char a = 200;先转成int型200再运算。

这个运算涉及C转型问题。
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

第一个a+b的运算结果是整数,编译器默认给你算好的。
第二个是你自己已经确定了类型是unsigned char,在算加法时是300,但在赋值时就被截断了。
这都是标准规定。
[/Quote]你的意思是说,
第一个问题,printf在输出第一个%d的时候,a+b是被当作整数来计算的?那为什么a+b在第二段代码里就成了44呢?
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
第一个a+b的运算结果是整数,编译器默认给你算好的。
第二个是你自己已经确定了类型是unsigned char,在算加法时是300,但在赋值时就被截断了。
这都是标准规定。
柳11 2012-07-14
  • 打赏
  • 举报
回复
无符号的char型的比啊是范围才0~255的哦!
baichi4141 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
就是说在计算a+b的时候,会将a和b先转为int型?a+b也就是int型入栈?
[/Quote]
一切低于整型的数据,计算时都先提升为整型,然后计算
至于计算结果再变为低于整型,那是一个隐式类型转换,很多编译器会报不安全
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 11 楼 的回复:
就是说在计算a+b的时候,会将a和b先转为int型?a+b也就是int型入栈?

一切低于整型的数据,计算时都先提升为整型,然后计算
至于计算结果再变为低于整型,那是一个隐式类型转换,很多编译器会报不安全
[/Quote]好的,谢谢
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我提的书都是C权威书,还有iso C标准文档。都是C解惑的法宝。
vc是款优秀的编译器,但不必以vc的结果马首是瞻。
[/Quote]嗯,找来看看~~多谢~
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

咱来看a+b是怎么开始算的。
a为无符char,值为200,转型为int型,unsigned char的信息没有丢失,是200, b也一样变为int型,把运算结果的整数压入栈就是300了。
如果:
a为signed char,在初始化时200表示的就是按-56解释,这点是规定。
然后转型signed char 转为int,-56的信息没有丢失,是-56,那么和b相加,结果是44.

……
[/Quote]就是说在计算a+b的时候,会将a和b先转为int型?a+b也就是int型入栈?
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
我提的书都是C权威书,还有iso C标准文档。都是C解惑的法宝。
vc是款优秀的编译器,但不必以vc的结果马首是瞻。
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
好的,非常感谢LS~~
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
咱来看a+b是怎么开始算的。
a为无符char,值为200,转型为int型,unsigned char的信息没有丢失,是200, b也一样变为int型,把运算结果的整数压入栈就是300了。
如果:
a为signed char,在初始化时200表示的就是按-56解释,这点是规定。
然后转型signed char 转为int,-56的信息没有丢失,是-56,那么和b相加,结果是44.

记住,a+b的结果默认是整数,就将这32位整型入栈,编译器更不会按类型指示符来确定它的入栈类型。
《可变目标C编译器设计与实现》一书及代码有详细的实现。
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

sorry,第二个问题我没看清题。
char a = 200;本质上是
char a = -56;因为对char来说200就是-56
后来的运算知道的。
[/Quote]就算是无符号的char,也不应该算出300来啊~~
- -
FridayRU 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

sorry,第二个问题我没看清题。
char a = 200;本质上是
char a = -56;因为对char来说200就是-56
后来的运算知道的。
[/Quote]哦好的,那回到第一个问题,因为300也是超出了unsigned char的范围的,这里a+b是300是不是因为printf的对象是%d,就直接给了一个int型来放这个a+b,而不是把a+b先算出来得到44再输出?
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
后来的运算你知道的。这必须运算转型问题,《C程序设计语言》《C语言参考手册》内详解。
ljhhh0123 2012-07-14
  • 打赏
  • 举报
回复
sorry,第二个问题我没看清题。
char a = 200;本质上是
char a = -56;因为对char来说200就是-56
后来的运算知道的。

70,024

社区成员

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

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