1. 在混合类型的算数表达式中:
int ival = 3;
double dval = 3.14;
// 最宽的数据类型成为目标转换类型,ival被提升为double类型3.0
ival + dval;
2. 用一种类型的表达式赋值给另一种类型的对象:
// 目标转换类型是被赋值对象的类型
ival = dval;
3. 把一个表达式传递给一个函数,表达式类型与形式参数类型不相同:
// 目标转换类型是形式参数的类型
extern double sqrt(double);
sqrt(2); // 2被提升为double类类型2.0
4. 从一个函数返回一个表达式的类型与返回类型不相同:
// 返回表达式类型自动转换成函数返回类型
double dif(int ival1, int ival2)
{
// 返回值被提升为double
return ival1 - ival2;
}
5. 两个通用原则:
(1)为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
(2)所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整型。
6. 在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升的过程。
7. long类型的一般转换有一个例外:
如果操作数是long型而另一个是unsigned int型,那么只有机器上的long型长度足以存放unsigned int的所有值时(一般不满足此假设),unsigned int才会被转换为long型,否则两个操作数都被提升为unsigned long型。若两个操作数都不是long型而其中一个是unsigned int型,则另一个也被转换成unsigned int型,否则两个操作数一定都是int型。
浙公网安备 33010602011771号