Skip to main content

第13章 数据类型的转换

13.1 基本概念

数据类型转换:把一种数据类型的值转为另一种类型,解决不同类型混合运算、传参、赋值不兼容问题。 分为两大类:隐式转换(自动)显式转换(强制)

13.2 隐式转换(自动转换)

编译器自动完成,无需手动书写转换代码。

转换总规则:小范围/低精度 → 大范围/高精度

整数优先级从小到大:char < short < int < long < long long 浮点优先级:float < double 混合运算:整数会自动转浮点。

常见触发场景

  1. 赋值:右边类型自动匹配左边
int a = 5;
double b = a; // int → double 自动转换
  1. 四则混合运算:统一提升为高精度类型
int x = 2;
float y = 3.5;
float res = x + y; // x转为float再相加
  1. 函数传参:实参自动匹配形参类型

隐式转换风险

  1. 大类型赋值给小类型:精度丢失、数值溢出
double d = 3.9;
int i = d; // 自动截断小数,i=3
  1. 有符号与无符号混合运算:负数变成超大正数,逻辑出错
int a = -1;
unsigned int b = 2;
if(a < b) // 实际判断为假,异常

13.3 显式转换(强制转换)

手动写明转换,覆盖自动转换规则,分C风格、C++四种专用转换。

13.3.1 C风格强制转换

语法:(目标类型)表达式

double pi = 3.14;
int num = (int)pi; // 舍弃小数

13.3.2 C++四种强制转换

  1. static_cast 最常用 基础类型互相转换、无继承关系类转换,安全常规转换:
float f = 5.8;
int n = static_cast<int>(f);
  1. const_cast 仅用来去掉变量const只读属性,仅限指针/引用。
  2. reinterpret_cast 底层重新解释内存(指针与整数互转),风险极高,极少使用。
  3. dynamic_cast 面向对象,用于父子类指针安全转换,运行校验。

13.4 转换常见问题解决

  1. 浮点转整数丢失小数:加0.5实现四舍五入
double x = 3.6;
int a = static_cast<int>(x + 0.5); // a=4
  1. 防止有/无符号比较出错:统一转为long long再比较
  2. 大数转小数前先判断数值是否在目标类型区间,避免溢出

13.5 C与C++转换对比

  1. C:只有(类型)一种强制转换,无检查,风险高
  2. C++:兼容C风格,新增四种专用转换,编译/运行有校验,更安全