第13章 数据类型的转换
info

对应 GESP C++ 2 级知识块⑤:数据类型的转换

官方要求:掌握数据类型的转换:强制类型转换和隐式类型转换。

第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) // 实际判断为假,异常
caution

有/无符号比较的经典坑 -1 和 unsigned int 比较时,-1 会被当成很大的正数(4294967295),导致 a < b 结果为假。GESP 判断题常考这个点,记住:别把负数和无符号数直接比。

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 面向对象,用于父子类指针安全转换,运行校验。
tip

2 级够用就行 GESP 2 级只要求会"强制类型转换"和"隐式类型转换"。(int)pi 和 static_cast<int>(pi) 都算强制转换,写哪种都行;后面三种(const_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 风格,新增四种专用转换,编译/运行有校验,更安全

练习题(2 级单选风格)

  1. 执行 int a = 3.9; 后,变量 a 的值是?
    • A. 3.9
    • B. 4
    • C. 3
    • D. 0
  2. 下列写法属于"强制类型转换"的是?
    • A. int a = 3.9;
    • B. (int)3.9
    • C. a = b;
    • D. 3 + 4.0
  3. int x = 5; double y = x; 这行代码发生了?
    • A. 强制转换
    • B. 隐式类型转换(整型提升为 double)
    • C. 编译错误
    • D. 数值被截断
  4. static_cast<int>(2.9) 的运算结果是?
    • A. 2.9
    • B. 3
    • C. 2
    • D. 0
  5. 关于浮点数赋给整型,下列说法正确的是?
    • A. 会自动四舍五入
    • B. 直接截断小数部分
    • C. 大范围类型转小范围类型总是安全
    • D. char 不能转换成 int
参考答案(点击展开)
  1. C — 把 double 3.9 赋给 int 会直接丢弃小数,结果 3(不是四舍五入)。
  2. B — (int)3.9 是 C 风格的强制转换;int a = 3.9 属于隐式转换被截断。
  3. B — 小范围 int 赋给大范围 double 时编译器自动做隐式提升,值不变。
  4. C — static_cast<int> 同样截断小数,2.9 → 2。
  5. B — 浮点赋整型直接截断(去尾);大范围转小范围可能溢出,并不安全;char 本质是整数可转 int。
SShowball OI知识手册