1、算术转换
许多运算符都会引发转换,以类似的方式产生结果类型,这个模式称为“寻常算术转换”。
首先,任何类型为char或short的操作数被转换为int,任何类型为float的操作数被转换为double。其次,如果其中一个操作数类型为double,那么另一个操作数被转换为double,计算结果类型也是double。再次,如果其中一个操作数类型为long,那么另一个操作数被转换为long,计算结果类型也为long。或者,其中一个操作数的类型数unsigned,那么另一个操作数被转换为unsigned,计算结果类型也为unsigned。如果不符合上面几种情况,那么两个操作数的类型都为int,计算结果类型也为int。
2、字符和整数
char,short int或int型位段,包括它们的有符号或无符号变形,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。
3、寻常算术转换
许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的是产生一个普遍类型,同时也是运算结果的类型。
首先,如果其中一个操作数的类型是long double,那么另一个操作数也会被转换为long double。其次,如果其中一个操作数类型为double,那么另一个操作数也被转换为double。再次,如果其中一个操作数的类型为float,那么另一个操作数也被转换为float。否则,两个操作数进行整形提升,执行下面的规则:如果其中一个操作数类型为unsigned long int,那么另一个操作数也被转换成unsigned long int。其次,如果其中一个操作数的类型是long int,而另一个操作数类型是unsigned int,如果long int能完整表示unsigned int的所有值,那么unsigned int类型操作数被转换为long int,如果long int 不能完整表示unsigned int的所有值,那么两个操作数都被转换为unsigned long int。再次,如果其中一个操作数的类型是long int,那么另一个操作数被转换为long int。再再次,如果其中一个操作数的类型是unsigned int,那么另一个操作数被转换为unsigned int。如果所有以上情况都不属于,那么两个操作数都为int。
浮点操作数和浮点表达式的值可以用比类型本身所要求的更大的精度和更广的范围表示,而它的类型并不因此改变。
——摘自《C专家编程》