info
对应 GESP C++ 2 级知识块⑤:数据类型的转换
官方要求:掌握数据类型的转换:强制类型转换和隐式类型转换。
第13章 数据类型的转换
13.1 基本概念
数据类型转换:把一种数据类型的值转为另一种类型,解决不同类型混合运算、传参、赋值不兼容问题。 分为两大类:隐式转换(自动)、显式转换(强制)。
13.2 隐式转换(自动转换)
编译器自动完成,无需手动书写转换代码。
转换总规则:小范围/低精度 → 大范围/高精度
整数优先级从小到大:char < short < int < long < long long
浮点优先级:float < double
混合运算:整数会自动转浮点。
常见触发场景
- 赋值:右边类型自动匹配左边
int a = 5;
double b = a; // int → double 自动转换
- 四则混合运算:统一提升为高精度类型
int x = 2;
float y = 3.5;
float res = x + y; // x 转为 float 再相加
- 函数传参:实参自动匹配形参类型
隐式转换风险
- 大类型赋值给小类型:精度丢失、数值溢出
double d = 3.9;
int i = d; // 自动截断小数,i = 3
- 有符号与无符号混合运算:负数变成超大正数,逻辑出错
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++ 四种强制转换
static_cast最常用 基础类型互相转换、无继承关系类转换,安全常规转换:
float f = 5.8;
int n = static_cast<int>(f);
const_cast仅用来去掉变量 const 只读属性,仅限指针/引用。reinterpret_cast底层重新解释内存(指针与整数互转),风险极高,极少使用。dynamic_cast面向对象,用于父子类指针安全转换,运行校验。
tip
2 级够用就行
GESP 2 级只要求会"强制类型转换"和"隐式类型转换"。(int)pi 和 static_cast<int>(pi) 都算强制转换,写哪种都行;后面三种(const_cast 等)了解即可,不必深究。
13.4 转换常见问题解决
- 浮点转整数丢失小数:加 0.5 实现四舍五入
double x = 3.6;
int a = static_cast<int>(x + 0.5); // a = 4
- 防止有/无符号比较出错:统一转为
long long再比较 - 大数转小数前先判断数值是否在目标类型区间,避免溢出
13.5 C 与 C++ 转换对比
- C:只有
(类型)一种强制转换,无检查,风险高 - C++:兼容 C 风格,新增四种专用转换,编译/运行有校验,更安全
练习题(2 级单选风格)
- 执行
int a = 3.9;后,变量 a 的值是?- A. 3.9
- B. 4
- C. 3
- D. 0
- 下列写法属于"强制类型转换"的是?
- A.
int a = 3.9; - B.
(int)3.9 - C.
a = b; - D.
3 + 4.0
- A.
int x = 5; double y = x;这行代码发生了?- A. 强制转换
- B. 隐式类型转换(整型提升为 double)
- C. 编译错误
- D. 数值被截断
static_cast<int>(2.9)的运算结果是?- A. 2.9
- B. 3
- C. 2
- D. 0
- 关于浮点数赋给整型,下列说法正确的是?
- A. 会自动四舍五入
- B. 直接截断小数部分
- C. 大范围类型转小范围类型总是安全
- D. char 不能转换成 int
参考答案(点击展开)
- C — 把
double3.9 赋给int会直接丢弃小数,结果 3(不是四舍五入)。 - B —
(int)3.9是 C 风格的强制转换;int a = 3.9属于隐式转换被截断。 - B — 小范围
int赋给大范围double时编译器自动做隐式提升,值不变。 - C —
static_cast<int>同样截断小数,2.9 → 2。 - B — 浮点赋整型直接截断(去尾);大范围转小范围可能溢出,并不安全;char 本质是整数可转 int。