C++类型转换:强制类型转换和隐式类型转换(附带实例)
在 C++ 中,变量的数据类型转换方式有两种:一种是隐式类型转换(又称为自动类型转换),一种是强制类型转换。
数据类型隐式转换的顺序如下图所示:

图 1 数据类型隐式转换的顺序
【实例 1】数据类型隐式转换。本实例中,定义一个字符型、一个整型和一个浮点型变量,利用隐式类型转换进行计算,具体代码如下:
注意,C++ 中整数的默认类型是 int,浮点数的默认类型是 double。如果一个计算中数字都是整数,则计算结果默认也是 int 型。但这样有时会出现一些“意想不到”的错误。
例如,计算 5 除以 2,如果这么写:
例如,“(float)x”表示把 x 强制转换为 float 型;“(int)(x+y)”表示把 x+y 的结果强制转换为 int 型;int(1.3) 表示将 1.3 强制转换为 int 型,最终结果为 1。
强制类型转换不改变数据说明时对该变量定义的类型。例如,下面的代码中 x 仍为 double 型:
【实例 2】计算载货区摆放箱子的数量。一辆货车运输箱子,载货区宽 2m,长 4m,一个箱子宽 1.5m,长 1.5m,请问载货区一层可以放多少个箱子。注意,箱子必须以一个整体存在,不存在半个箱子。实现的具体代码如下:
注意,如果要对某个表达式进行强制类型转换,需要用括号将表达式括起来,否则将只对表达式中的第一个变量或常量进行强制类型转换。例如:
C++隐式类型转换
隐式类型转换发生在不同数据类型的量进行赋值或混合运算时,由编译系统自动完成,并遵循以下规则:- 赋值表达式中,“=”右边量的数据类型会自动转换为左边量的数据类型。如果右边量的数据类型精度比较高,则赋值后会降低精度,丢失一部分数据(丢失部分按“四舍五入”规则向前舍入);
-
算术表达式中,若参与运算的多个量的数据类型不同,则会先转换成统一类型,然后再进行运算。转换原则是:将数据由低精度类型转换为高精度类型,以保证精度不降低:
- int 型和 long 型混合运算时,先把 int 型转换为 long 型,再进行运算。
- 浮点数都是以 double 型进行运算的,哪怕是仅含 float 型的表达式,也会先转换成 double 型,再进行运算。
- char 型和 short 型运算时,必须先转换成 int 型。
数据类型隐式转换的顺序如下图所示:

图 1 数据类型隐式转换的顺序
【实例 1】数据类型隐式转换。本实例中,定义一个字符型、一个整型和一个浮点型变量,利用隐式类型转换进行计算,具体代码如下:
#include <iostream> using namespace std; int main() { double result; char a = 'k'; int b = 10; float e = 1.515; result = (a + b) - e; // 运算结果自动转换为最高精度的数据类型 (double) printf("%f\n", result); }程序运行结果如下:
115.485001
注意,C++ 中整数的默认类型是 int,浮点数的默认类型是 double。如果一个计算中数字都是整数,则计算结果默认也是 int 型。但这样有时会出现一些“意想不到”的错误。
例如,计算 5 除以 2,如果这么写:
double b = 5 / 2;计算后会发现 b 的值居然是 2.0,而不是 2.5。要想得到正确的答案,应该这样修改:
double b = 5.0 / 2; //把其中一个数改为浮点数,以保证精度
C++强制类型转换
强制类型转换是通过类型转换说明符来实现的,其一般形式如下:类型说明符 (表达式)(类型说明符) 表达式其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如,“(float)x”表示把 x 强制转换为 float 型;“(int)(x+y)”表示把 x+y 的结果强制转换为 int 型;int(1.3) 表示将 1.3 强制转换为 int 型,最终结果为 1。
强制类型转换不改变数据说明时对该变量定义的类型。例如,下面的代码中 x 仍为 double 型:
double x; (int)x;使用强制类型转换,意味着将由程序员负责保证类型转换的正确性。
【实例 2】计算载货区摆放箱子的数量。一辆货车运输箱子,载货区宽 2m,长 4m,一个箱子宽 1.5m,长 1.5m,请问载货区一层可以放多少个箱子。注意,箱子必须以一个整体存在,不存在半个箱子。实现的具体代码如下:
#include <iostream> using namespace std; int main() { int width = 2, length = 4, num; // width、length 表示载货区大小 float f = 1.5f; // f 表示箱子规格 num = (int)(width / f) * (int)(length / f); // 计算装载量,并强制转换为整数 cout << "载货区一层可以放" << num << "个箱子" << endl; return 0; }程序运行结果如下:
载货区一层可以放2个箱子
注意,如果要对某个表达式进行强制类型转换,需要用括号将表达式括起来,否则将只对表达式中的第一个变量或常量进行强制类型转换。例如:
float x = 2.5f, y = 4.7f; // 定义两个 float 型变量并赋值 int m = (int)(x + y); // 将表达式 x+y 的结果强制转换为整型,并赋给 m int n = (int)x + y; // 将 x 强制转换为整型,与 y 相加后,结果赋给 n