C++自动执行很多类型转换:
• 将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换:
• 表达式中包含不同的类型时,C++将对值进行转换;
• 将参数传递给函数时,C++将对值进行转换。
1.初始化和赋值进行的转换
一种类型的值赋给另一种变量时,值将被转换为接受变量的类型。将一个值赋给取值范围更大的类型通常不会导致什么问题,否则可能会出现一些转换问题。例如,double转换为float,精度降低,值有可能超出范围,结果是不确定的:浮点型转换为整型,丢失小数部分,值有可能超出范围,结果不确定:较大整型装换位较小整型,原来的值可能超出范围,通常只复制右边的字节。
2.以{}方式初始化时进行的转换(C++11列表初始化)
这种初始化常用于给复杂的数据类型提供值列表,对类型转换的要求更严格,不允许窄缩(即变量的类型可能无法表示赋给它的值)。
3.表达式中的转换
整型提升:在计算表达式中,C++将bool、char、unsigned char、signedchar和short转换位int。
C++11:
(1) 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
(2)否则,如果有一个操作数的类型是double,则将另一个操作数转换为double
(3)否则,如果有一个操作数的类型是float,则将另一个操作数转换为float
(4)否则,说明操作数都是整型,因此执行整型提升。
(5)在这种情况下 ,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
(6)如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。(7)否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
(8)否则,将两个操作数都转换为有符号类型的无符号版本
PS:传统C总是将float提升为double,即使两个操作数都是float。
4.传递参数时的转换
传递参数时类型的转换通常由函数原型控制,然而也可以取消原型对参数传递的控制,在这种情况下,C++对char和short类型进行整型提升。另外为保持与传统C兼容,在将参数传递给取消原型对参数传递控制的函数,C++将float参数提升为double。
5.强制类型转换
(typeName) value; 来自C
typeName (value); C++
强制类型不会修改变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值。
C++还引入了4个强制类型转换运算符,对他们的使用要求更为严格。
static_cast<>
可用于将值从一种类型转换为另一种类型。
static_cast<typeName> value