很多二元运算符(在带二元运算符的表达式中有讨论)会导致操作数转换并以相同的方式产生结果。 这些运算符导致转换的方式称为“常用算术转换”。不同本机类型的操作数的算术转换按下表所示的方式执行。 Typedef 类型的行为方式基于其基础本机类型。
类型转换的条件
满足的条件 |
转换 |
---|---|
其中一个操作数是 long double 类型。 |
另一个操作数将转换为 long double 类型。 |
未满足上述条件,并且其中一个操作数是 double 类型。 |
另一个操作数将转换为 double 类型。 |
未满足上述条件,并且其中一个操作数是 float 类型。 |
另一个操作数将转换为 float 类型。 |
未满足上述条件(没有任何一个操作数属于浮动类型)。 |
整型提升按以下方式对操作数执行:
|
以下代码演示了上表中所述的转换规则:
// arithmetic_conversions.cpp
double dVal;
float fVal;
int iVal;
unsigned long ulVal;
int main() {
// iVal converted to unsigned long
// result of multiplication converted to double
dVal = iVal * ulVal;
// ulVal converted to float
// result of addition converted to double
dVal = ulVal + fVal;
}
上面的示例中的第一个语句显示了两个整数类型 iVal 和 ulVal 的相乘。 满足的条件是两个操作数都不是浮动类型,并且一个操作数是 unsigned int 类型。 因此,另一个操作数 (iVal) 将转换为 unsigned int 类型。 结果将分配给 dVal。 满足的条件是一个操作数是 double 类型;因此,相乘的 unsigned int 结果将转换为 double 类型。
前面的示例中的第二个语句显示了 float 类型 fVal 和整数类型 ulVal 的相加。 ulVal 变量将转换为 float 类型(表中的第三个条件)。 相加的结果将转换为 double 类型(表中的第二个条件)并分配给 dVal。