在C++中,进行算术运算前通常需要对操作数进行类型转换,特别是对两个类型不同的操作数,往往要把它们转换成相同类型。算术运算的结果类型与转换后的操作数类型相同。
C++的类型转化方式有两种:隐式转换和显式转换。隐式转换由编译程序按照某种预定的规则进行自动转换;显式转换由写程序的人在程序中用类型转换操作符明确地指出转换。
当操作数的类型为算术类型或者枚举类型时,在进行算术运算前,编译程序将按照常规算术转换规则(usual arithmetic conversion)自动进行操作数类型转换,其转换规则如下:
a) 如果其中一个操作数类型为long double,则另一个转换成long double。
b) 否则,如果其中一个操作数的类型为double,则另一个转换成double。
c) 否则,如果其中一个操作数的类型为float,则另一个转换成float。
d) 否则,先对操作数进行整型类型提升转换(integral promotion),如果转换后操作数的类型不一致,则按(e)以后的类型再进行转换。整型提升转换规则是:
¨ 对于char、signed char、unsigned char、short int、unsigned short int类型,如果int型能够表示它们的值,则这些类型转换成int,否则这些类型转换成unsigned int。
¨ bool型转换成int型,false为0,true为1。
¨ wchar_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:int、unsigned int、long int、unsigned long int。
e) 如果其中一个操作数类型为unsigned long int,则另一个转换成unsigned long int。
f) 否则,如果一个操作数类型为long int,另一个操作数类型为unsigned int,那么如果long int能够表示unsigned int的所有值,则unsigned int转换成long int,否则两个操作数都转换成unsigned long int。
g) 否则,如果一个操作数类型为long int,则另一个操作数转换成long int。
h) 否则,如果一个操作数类型为unsigned int,则另一个操作数转换成unsigned int。
注:如果(h)仍不满足,则根据(d)的整型提升规则可知,两个操作数都已是int型了。
隐式类型转换有时不能满足要求,而需要在程序中显式指出转换,即进行显式转换。显式转换又称强制类型转换,可以用强制类型转换操作符来实现,其格式为:
<类型名>(<操作数>)
或
(<类型名>)<操作数>
注:
¨ 从表示范围大的类型强制转换到表示范围小的类型,有时会丢失精度。
不管是显式转换还是隐式转换,都不会改变被转换的操作数的值,转换得到的结果将存储在临时的存储单元中。