C++类型转换

一.隐式转换

如果两个运算对象类型不同,C++语言不会直接将两个不同类型的值相加,而是先根据类型转换规则设法将运算对象的类型统一后再求值,上述的类型转换是自动执行的,因此被称作隐式转换。

算术类型之间的转换被设计得尽可能避免损失精度。例如,如果表达式中既有整数类型也有浮点数类型的运算对象,整型会转换为浮点型。

int val=3.14+3; //val的值为6

上述例子中,int型和double型相加,3转换为double型,然后执行浮点数加法,所得结果类型是double。
接下来是对val的初始化,因为被初始化的对象的类型无法改变,所以初始值被转换成该对象的类型。所以double类型的结果转换成int类型的值,这个值被用来初始化val。double向int类型的转换忽略小数部分,因此数值6赋给了val;

隐式类型转换发生情况(编译器自动转换运算对象的类型):
1.在大多数表达式中,比int类型小的整型值(bool,char,short等)首先提升为较大的整数类型。
2.在条件中,非bool转换成bool类型。
3.初始化过程中,初始值转换为变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型。
4.如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
5.函数调用时也可能发生类型转换。

算术转换

算术转换
算术转换的含义是把一种算术类型转换成另一种算术类型。
算术转换的规则定义了一套类型转换的层次,其中运算符的运算对象会转换成最宽的类型。另一种更普遍的情况是,当表达式中既有浮点类型也有整数类型时,整数值将转换成相应的浮点类型。

整型提升
整型提升负责把小整数类型转换成较大的整型类型。对于bool,char,signed char,unsigned char,short和unsigned short等类型来说,只要它们所有可能的值都能存在int里,它们就会提升成int类型,否则提升成unsigned int类型。

无符号类型的运算对象
如果某个运算符的运算对象类型不一致,这些运算对象将转换为同一种类型,但是如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个整数类型的相对大小了。
像往常一样,首先执行整型提升。如果结果的类型匹配,无须进行进一步的转换。如果两个(提升后的)运算对象的类型要么都是带符号的、要么都是无符号的,则小类型的运算对象转换成较大的类型
如果一个运算对象是无符号类型、另外一个运算对象是带符号类型,而且其中的无符号类型不小于带符号类型,那么带符号的运算对象转换成无符号的。例如,假设两个类型分别是unsigned int和int,则int类型的运算对象转换成unsigned int类型。
剩下的一种情况是带符号类型大于无符号类型,此时转换的结果依赖于机器。如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型。如果不能,那么带符号类型的运算对象转换成无符号类型。例如,如果两个运算对象的类型分别是long和 unsigned int,并且int和long 的大小相同,则long类型的运算对象转换成unsigned int类型;如果 long类型占用的空间比 int更多,则unsignedint类型的运算对象转换成long类型。

其他隐式转换

除了算术转换之外还有几种隐式类型转换,包括如下几种。
数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针;

int ia[10];
//含有10个整数的数组
int* ip - ia;
// ia转换成指向数组首元素的指针

指针的转换:C++还规定了几种其他的指针转换方式,包括常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*。

转换成布尔类型:存在一种从算术类型或指针类型向布尔类型自动转换的机制。如果指针或算术类型的值为0,转换结果是false:否则转换结果是true:

char *cp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值