1.表达式中的转换。当同一个表达式中包含两种不同的算术类型时,C++将执行两种自动转换:首先,
一些类型中出现时会自动转换:其次,有些类型中与其他类型同时出现是在表达式中时,将被转换
先看自动转换,在计算表达式时,C++将boll,char,unsigned,char,signedchar和short值转
换为int。具体的说true被转换为1.falsc被转换为0.这些转换被称为整形提升,例如
short chickens = 20;
short ducks = 35;
short fowl = chickens + ducks;
为执行第三行语句C++程序取得chickens和ducks的值,并将它们转换为int。然后,程序将结果转换
为short型,因为结果将被赋给一个short变量。通常将int类型选择为计算机最自然的类型,这意味着
计算机使用这种类型时,运算速度可以最快。
还有一些其他提升,如果short比int短,则unsigned short类型将被转换为int:如果两种类型长度
相同unsigned short类型转被转换成unsigned int。这种规则确保了在对unsigned short 进行提升
时不会损失数据。
2.wchar_t被提升为下列类型中的一个宽度足够存储wchar_t取值范围的类型:int,unsigned int,long
或unsigned long。
将不同类型进行算术运算时,也会进行一些转换,例如将int 和float相加时,当运算设计两种类型时,
较小的类型将被转换为较大的类型。编译器通过校验表来确定在算是表达式中执行的转换。
3.C++校验表:
1.如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
2.否则,如果有一个操作数的类型是double,则将另一个操作转换为double。
3.否则,如果有一个操作数类型是float,则将另一个操作转换为float。
4.否则,说明操作数都是整型,因此执行整型提升。
5.在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个级别低,则
转换为级别更高的类型。
6.如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将
有符号操作数转换为无符号操作数所属的类型。
7.否则,如果有符号类型可以表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属
类型。
8.否则,将两个操作数都转换为有符号类型的无符号版本。
有符号整型按级别从高到低依次为long long,long,int,short和signed char。无符号整型的排列顺序
与有符号整型相同。类型char,signed char 和unsigned char 的级别相同。类型bool的级别最低。
wchar_t,char16_t,和char32_t的级别与其底层类型相同。
4.传递参数时的转换:传递参数时的类型转换通常由C++函数原型控制,然而,也可以取消原型对参数传递的
控制,尽管这样并不明智。在这种情况下,C++将对char和short类型应用整型提升。另外,为毛吃与传统C
语言中大量代码的兼容性,在将参数传递给取消原型对参数传递控制的函数时,C++将float参数提升为double。