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