C++类型转换问题系统学习

写在前面

  • 面向初学者撰写专栏,个人原创的学习C/C++笔记(干货
  • 所作源代码输出内容为中文,便于理解
  • 如有错误之处请各位读者指正
  • 请读者评论回复、参与投票,反馈给作者,我会获得持续更新笔记干货的动力。

致粉丝:可以在阅读完我的文章后,自己尝试写一点原创心得(哪怕一行字也好)。
               希望众(尽管800个🤣)粉丝多多支持、浏览、自我创作@_@


知识点概览 

写在前面

知识点概览 

一.为什么进行类型转换

1.C++数值类型丰富

2.计算机需要处理特殊类型情况

二.类型转换的一些基本规则

1.初始化数值与赋值时进行转换

2.表达式内的类型转换

3.类型级别塔(高到低):

4.(C++11新特性)以花括号{}方式初始化进行转换 

5.传递函数参数时的类型转换

6.强制类型转换

结语

一.为什么进行类型转换

1.C++数值类型丰富

  • C++拥有丰富的类型,在编译程序时根据不同的类型需求选择适当类型
  • 不同种数值类型运算时,计算机的编译指令与内容会有不同
  • 在此链接文章:学习C++基本数值类型 
  • 例如:在 short 整型1和 short 型1相加时的编译指令与 int 整型300和 int 型300相加可能不同

2.计算机需要处理特殊类型情况

  • 处理一组同类型的数值与另一组同类型的数值计算
  • 处理不同类型的多个数值混杂计算
  • 一种类型的值给另一种类型的值赋值
  • 处理参数(一般情况下是实参)数值传递给函数
  • 在此链接文章: 简洁易懂地介绍C++参数

二.类型转换的一些基本规则

1.初始化数值与赋值时进行转换

long l_Big = 300;
short s_small = l_Big;

         如上面的例子

  1. 把long类型的变量l_Big初始化为300;
  2. 把long类型变量l_Big的值赋给较短的short类型变量s_small。
  3. 本例可能运行时不会出大问题。但是当l_Big数值大到超过short类型取值范围时,会出现未知的错误(例如,数值的上溢和下溢)
  4. 把一个小类型数值赋给较大类型数值一般不会出问题,只会在内存里占用更多的字节。
  5. 下表列出了一些类型转换可能出现的问题:
类型转换示例可能出现的问题
较大整型-->较小整型long转short原较大值超过小类型取值范围
浮点类型-->整型double转int原小数部分被丢弃,也可能超过后者的取值范围
较大浮点型-->较小浮点型double转float精度降低(有效数位减少),或超出后者取值范围

注意:浮点类型转换为整型时,直接丢弃小数部分,而不是四舍五入保留整数部分 

注意:bool类型变量,只有数值0赋给bool类型会转换为false(假),其他任意类型非零数值都会转换成true(真)。

2.表达式内的类型转换

1.整型提升:

  • 计算表达式时,将如下几种类型转换为int类型(因为计算机处理最快的类型是int)
    bool,char,unsigned char,signed char,short等
    计算结束转换回去
  • 其他类型,如short和unsigned short
    • 如果short比int短,unsigned short转为int
    • 如果short和int一样长,unsigned short转为unsigned int

2.两种或多种类型混合时,多采取“小类型转换为大类型”。

3.校验表(C++11标准):

  • 如一个操作数类型是long double,则将另一个操作数转换为long double
  • 否则,如一个操作数类型是double,则将另一个操作数转换为double
  • 否则,如一个操作数类型是double,则将另一个操作数转换为double
  • 否则,两个操作数都不是浮点数,都将会执行整型提升
  • 此情况下若两个操作数都是有或无符号的类型,低级别操作数转高级别类型
  • 操作数中一个有符号类型,另一个无符号类型且级别较高,则有符号类型转为该无符号类型
  • 否则,若有符号类型可以表示无符号类型所有取值,则将无符号操作数转为有符号所属类型
  • 否则,将两个操作数都转为有符号类型的无符号版本

3.类型级别塔(高到低):

有符号整型类其他类型
(注:无符号整型类同有符号整型类)(空)
long long(空)
long(空)
int(空)
short(空)
signed charchar,signed char,unsigned char同级
(空)wchar_t,char16_t,char_32_t与其底层类型相同
(空)bool最低

4.(C++11新特性)以花括号{}方式初始化进行转换 

1.也称作列表初始化,常用于给复杂数据类型提供值列表,要求更严格,不允许缩窄,可能不能用小类型表示大类型数值,且不允许将浮点型转换为整型。

2.只要类型长度足够,就可以进行初始化类型转换

5.传递函数参数时的类型转换

  • 通常收函数原型控制,也可以取消这种控制,但不推荐
  • 传递时一般将float转换为double

6.强制类型转换

  • 为了便于程序员在让数值存储为一种类型时,可让它计算得到其他类型值,但不改变原值
  • 达到对一种值能够满足不同需求
  • 两种基本强制类型转换符:注意:变量名必须已声明并赋值
(括号里放类型名)变量名或数值//方法一
变量名或数值(括号里放类型名)//方法二
static——cast<类型名>(变量或数值)

结语

       今天我们共同学习了:C++类型转换的原因与基本规则,涉及初始化数值/表达式内的/列表初始化的/传递参数时的/强制类型转换,以及数值级别塔 等重要知识。
       学编程是一条漫长的路,贵在坚持。每天学习来提升自己的的编程能力,成为耀眼的IT之星。
       各位读者跟随我的脚步,我们共同努力,共同进步吧!

返回作者主页

专栏下一篇文档:学习C++基本数值类型 

其它文章:C++学习/温习笔记:源码学编程(一)(优秀博文)

                  C语言求幂运算(尽大支持)——中文式奇特命名

                  简洁易懂地介绍C++参数

                  C/C++基础运算符


 如有探讨问题联系邮箱:yhlz0613@163.com

对于文章中的错误请各位批评指正,我一定及时更正

请在投票后评论回复意见,如有关于写博文的指导也请您回复提出

 <!--感谢浏览                    诸君慢行且留言          过客匆匆常回访-->

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值