C++内置类型对象之间的转换

C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上。

隐式类型转换发生在下列这些典型情况下。

1. 在混合类型的算数表达式中

规则:在这种情况下最宽的数据类型成为目标转换类型,这也被称为算术转换。

例子:

1 int ival = 3;
2 double dval = 3.14159;
4 // ival被提升为double类型:3.0
5 ival + dval;

2. 用一种类型的表达式赋值给另一种类型的对象

规则:这种情况下目标转换类型是被赋值对象的类型。

例子:

1 // 0被转换成int*类型的空指针值
2 int* pi = 0;
3 // dval被截取为int类型:3
4 ival = dval;

3. 把一个表达式传递给一个函数,形参与表达式的类型不同

规则:这种情况下目标转换类型是形参的类型。

例子:

1 extern double sqrt(double);
2 // 2被提升为double类型:2.0
3 cout << sqrt(2) << endl;

4. 从一个函数返回一个表达式,表达式的类型与返回类型不同

规则:这种情况下目标转换类型是函数返回类型。

例子:

1 double reduce(int ival1, int ival2)
2 {
3     // 返回值被提升为double类型
4     return ival1 - ival2;
5 }

算术转换的基本原则:

1、为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。

2、所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型。

规则的定义如上面所述,这些规则定义了一个类型转换层次结构。

一般有:

long double > double > float

如果两个操作数都不是3种浮点类型之一,它们一定是某种整值类型。在确定共同的目标提升类型之前,

编译器将在所有小于int的整值类型上施加一个被称为整值提升(integral promotion)的过程。

在进行整值提升时类型char、signed char、unsigned char和short int都被提升为类型int。

一旦整值提升执行完毕,类型比较就又一次开始。

总结:尽管算术转换的这些规则带给你的困惑可能多于启发,但是一般的思想是尽可能地保留多类型表达式中涉及的值的精度。

这正是通过把不同的类型提升到当前出现的最宽的类型来实现的。