不同数据类型的混合运算结果类型是什么?

芸芸芸芸 2011-05-15 01:01:22
RT,根据谭浩强讲的,
double<---float

long

unsigned

int<--char、short

在做运算的时候,自左向右的方向是由编译系统自己完成而且一定完成的转换。也就是char和int做运算结果一定是int类型的。
而自下而上的转换看表达式,如果int和long做运算,则int转成long,最后结果是long类型。
如果int和float运算,先有float到double,再由int到double。最后结果是double。

---------------------------------------
那么两个char型的数据运算的话,结果是什么类型?为什么结果还是char型???按他的讲法应该是int才行的啊,为什么不报错啊?


同样两个float类型的数据相加,为什么结果也是float而不是double类型的啊????
...全文
1932 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Thirty 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chinayuppie 的回复:]

尽信书不如无书~~~~
[/Quote] 的却,能够有独立思维能力的人,敢于怀疑的人的却不多。
赵4老师 2011-05-16
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!
booksoon 2011-05-16
  • 打赏
  • 举报
回复
尽信书不如无书~~~~
lihongchuan 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]

谭所列出的这条数值转换路径是错误的,谭的书扔掉,别看了。


整形提升的目标类型并非一定就是int,当unsigned short的表示范围超过int时,目标类型是unsigned int而不是int;

从unsigned--->long--->double这条路经很可笑,这条路径所使用的转换已经不属于提升了,而是标准转换,标准转换的结果要视表达式的最高等级数值类型而定,并非unsi……
[/Quote]



高手!!!!
AnYidan 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
谭所列出的这条数值转换路径是错误的,谭的书扔掉,别看了。


整形提升的目标类型并非一定就是int,当unsigned short的表示范围超过int时,目标类型是unsigned int而不是int;

从unsigned--->long--->double这条路经很可笑,这条路径所使用的转换已经不属于提升了,而是标准转换,标准转换的结果要视表达式的最高等级数值类型而定,并非unsig……
[/Quote]

整型提升 -- 将表达式中的整型数据提升为 int 或 unsigned int,之后计算
飞天御剑流 2011-05-15
  • 打赏
  • 举报
回复
谭所列出的这条数值转换路径是错误的,谭的书扔掉,别看了。


整形提升的目标类型并非一定就是int,当unsigned short的表示范围超过int时,目标类型是unsigned int而不是int;

从unsigned--->long--->double这条路经很可笑,这条路径所使用的转换已经不属于提升了,而是标准转换,标准转换的结果要视表达式的最高等级数值类型而定,并非unsigned int一定转换到long或者long一定转换到double,这是非常非常错误的。




那么两个char型的数据运算的话,结果是什么类型?为什么结果还是char型???按他的讲法应该是int才行的啊,为什么不报错啊?
--------------------------------------------------------------------------------
对于这个问题,谭所说的对一半但错一半,为什么呢,这个问题要分为两部分来理解,一是抽象语义,二是实现语义;谭所说的必定先提升到int,这是抽象语义,但编译器在实现的时候,不一定总有提升这一步骤,要视情况而定,这就是实现语义。

例如:

char a, b, c;
a = b + c;

从抽象语义上说,b和c提升到int这一过程是肯定有的,这一提升的过程由编译器隐式完成;但编译器在实现时,不一定非要把b和c提升到int不可,例如,如果编译器确定b和c相加时不会产生溢出,它可以选择直接两个char相加也可以,当然如果编译器选择无论如何都进行提升也没问题。这是编译器设计者的权利。

为什么需要提升?为什么要把提升单独提出来?除了性能的考虑,还有一个重要原因就是提升保证转换后和转换前的数值是不变的。

对于两个float相加的情况也跟上述类似,抽象语义上必然有float到double的转换,但实现可以自行根据情况选择。
caodaxia 2011-05-15
  • 打赏
  • 举报
回复
老谭讲的是 不同类型的数据运算的时候,运算时会先全部默认转换成长类型后再运算,结果也会是长类型
char 和 char 运算那是属于 相同类型的运算了,就不用转换了,结果也就还是那个类型了
5t4rk 2011-05-15
  • 打赏
  • 举报
回复
恩,数据类型不同在内存的所占空间大小不同。
但是为了不同类型都能参与运算,必须转化成
相同的,而自然是占得空间小的,转化时防止丢失数据
则向上转化,进而成相同的类型,最后参与运算
(注意:相同的不用转化)
如此美丽的你 2011-05-15
  • 打赏
  • 举报
回复
没有遇到比自己高级的就不转换!!!!!!!!!!!
slience_ff 2011-05-15
  • 打赏
  • 举报
回复
相同类型的做运算 结果类型不变啊 除非你用强制转换

69,371

社区成员

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

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