2.5.2 表达式中的转换

    当同一个表达式中出现不同类型的量时,C++会根据不同的情况对操作数进行自动转换,这些转换可分为“整型提升”(Integral Promotion)和“运算时的转换”两类。

    1.整型提升

    在表达式计算中,C++将bool、char、unsigned char、signed char、short和signed short型值自动转换成int型,对bool类型而言,true转换为1,false则转换为0。注意unsigned short向int的转换比较特殊。如果系统中int占4字节,则unsigned char会转换成int,但若系统中int占两字节(即int和short同样长度),则unsigned short会转换成unsigned int,则就避免了数据的丢失。

    注意

    在表达式中,所有的float类型都转换为double型以提高运算精度。

    2.运算时的转换

    当运算涉及两种类型时,较小的类型将会被转换成较大的类型,换言之,表达力低的类型将会被转换成表达力高的类型。各类型表达能力从低到高排列顺序如下所示。


    int(等价于signed int)→unsigned int→long(等价与signed long)→unsigned long→float→double→long double

    在此要注意一个特殊情况,如果两个操作数分别为long和unsigned int,要根据long和unsigned int的相对长度决定如何转换。如果long能表示unsigned int的值,则将unsigned int转换为long,否则,将两个操作数都转换成unsigned long。

    和赋值转换一样,表达式中的转换也是由编译器自动完成的,如下面的代码所示。


    double x=4.5; int y=3; int z=x-y;

    表达式“int z=x-y;”中x和y的类型不同,首先进行表达式中的转换,将int型变量y转换为double型,再与x相加,得到一个double型的结果,在赋值给int型变量z时,赋值号两边的类型不匹配,则进行赋值转换,将double型结果转换为int型。