咬文嚼字 C++ 整型提升

Citron__ 2017-10-23 07:56:46
今天在看c++ primer 的时候,看见了c++ 的整型提升的概念
道理都看懂了。但是具体的情况稍微有点迷糊,
先上图:

vs文档中常用算术转换规定。
如果任一操作数是 long double 类型,则将另一个操作数转换为 long double 类型。
如果未满足上述条件,并且任一操作数是 double 类型,则将另一个操作数转换为 double 类型。
如果未满足上述两个条件,并且任一操作数是 float 类型,则将另一个操作数转换为 float 类型。
如果未满足上述三个条件(所有操作数都不是浮点型),则对操作数执行整型转换,如下所示:
如果任一操作数是 unsigned long 类型,则将另一个操作数转换为 unsigned long 类型。
如果未满足上述条件,并且任一操作数是 long 类型且另一个操作数是 unsigned int 类型,则将两个操作数都转换为 unsigned long类型。
如果未满足上述两个条件,并且任一操作数是 long类型,则将另一个操作数转换为 long 类型。
如果未满足上述三个条件,并且任一操作数是 unsigned int类型,则将另一个操作数转换为 unsigned int 类型。
如果未满足上述任何条件,则将两个操作数转换为 int 类型。
换句话说就是:如果某个操作数的类型在上面这个列表中排名较低,那么它首先将转换成另外一个操作数的类型然后执行。
如果这样来说,为什么

cval+fval 还是进行了整型提升后再转换为float

如果上面这段话是对的,那所谓的整型提升是在在cval这个内存中取值的时候发生的,取出这个值后,再检查fval的值,再进行隐式转换是么,如果是这样
为什么

cval+lval

不是cval先转换为int,再转换为long呢?
...全文
256 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2017-10-24
  • 打赏
  • 举报
回复
cval+fval 还是进行了整型提升后再转换为float 因为是符点数, 一个是整数. 并且float是32位. 只能这么转换. 而cval+lval 两个都是整数类型, 仅是位数不同. 中间转一个int, 就没有必要的, 按你的思路那为什么不先转换成 short, 再转换成 int, 最后转换成long
paschen 版主 2017-10-24
  • 打赏
  • 举报
回复
这里是整形提升,对于所有比int小的整形,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包含在int内,它们就会被提升为int
赵4老师 2017-10-24
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
python_xep 2017-10-24
  • 打赏
  • 举报
回复
  说白了 就是计算时候 对齐宽度的问题 可以画一下 1000 + 25 --------- 转化为 1000 +0025 ----------
Citron__ 2017-10-24
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
cval+fval 类型隐式提升,是向较高一级的类型提升,可以理解为向表示的范围较大的一级提升,cval是char类型,fval是float类型,那么他们的运算是char向float提升。这样得到的是float类型; 个人认为没有char先向int提升,再向float提升;即使有的,最终也是float类型。
查看了下汇编代码,确实有整型提升,我不明白的是char->long 是否也有先向int提升,再提升为long 汇编代码都是movsx,有点看不懂是一步到long还是int到long了
自信男孩 2017-10-24
  • 打赏
  • 举报
回复
cval+fval 类型隐式提升,是向较高一级的类型提升,可以理解为向表示的范围较大的一级提升,cval是char类型,fval是float类型,那么他们的运算是char向float提升。这样得到的是float类型; 个人认为没有char先向int提升,再向float提升;即使有的,最终也是float类型。
xskxzr 2017-10-24
  • 打赏
  • 举报
回复
整形提升和算数转换是两回事。 先整形提升再算术转换。
xiaohuh421 2017-10-24
  • 打赏
  • 举报
回复
引用 6 楼 Citron__ 的回复:
那如果是char + double(64位)呢,是char转换为int再转换为double么
既然是对齐, 那么肯定会转成64位的整型,再转double撒, 比如转换成long long类型
Citron__ 2017-10-24
  • 打赏
  • 举报
回复
引用 5 楼 xiaohuh421 的回复:
cval+fval 还是进行了整型提升后再转换为float 因为是符点数, 一个是整数. 并且float是32位. 只能这么转换. 而cval+lval 两个都是整数类型, 仅是位数不同. 中间转一个int, 就没有必要的, 按你的思路那为什么不先转换成 short, 再转换成 int, 最后转换成long
那如果是char + double(64位)呢,是char转换为int再转换为double么

64,694

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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