GESP C++ 2 级 · 知识点

数据类型的转换

GESP C++ 二级要求掌握整型、浮点型、字符型、布尔型之间自动转换与强制转换的规则,能预判转换后的结果。整数除法与浮点除法的差别,是这一节最常考、也最容易丢分的点。

对应知识域:数据类型的转换相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 理解自动类型转换的方向:char 转 int、int 转 long long、整型转 float 与 double,范围小的类型会向范围大的类型转换。
  • 知道整数与浮点数混合运算时,整数会先转成浮点数,结果带小数部分。
  • 掌握强制类型转换的写法,例如 (double)a / b 或 static_cast<double>(a) / b。
  • 能判断赋值时发生的截断:把浮点数赋给整型变量会丢弃小数部分,而不是四舍五入。

典型题型

  • 给出混合运算表达式,要求写出输出结果和结果的类型。
  • 判断 (int)3.9 的结果是 3 还是 4。
  • 分析整型相除后再转成浮点,与先转成浮点再相除的差别。

常见错误

  • 以为 (int)3.9 会四舍五入得到 4。强制转换直接截断小数部分,结果是 3。
  • 写成 double avg = (a + b) / 2,两个 int 先做整除再赋值,小数已经丢失。至少要让一个操作数先变成 double。
  • 以为字符 'A' 转成 int 会得到 1。转换得到的是它的编码值 65。
  • 把大范围类型的值赋给小范围变量,溢出后结果不可预期。

深入理解

自动转换只朝「装得下」的方向走

混合运算时,编译器会把取值范围小的类型自动转成取值范围大的类型,避免数据丢失。常见方向是:bool → char → int → long long → float → double,同级之间按位数扩展。所以 int 和 double 相加时,int 先变成 double,结果也是 double。

反向赋值则可能丢数据:把 double 赋给 int 会直接截掉小数部分,int x = 3.9; 得到 3,而不是 4。这不是四舍五入,也不是报错,编译器最多给个警告,所以最容易被忽略。

整数除法的两种救法

7 / 2 两个都是整数,做整除得 3。要让结果带小数,必须让至少一个操作数变成浮点型,两种写法都常见:

double avg = (double)sum / n;      // 强制转换
double avg = sum * 1.0 / n;        // 乘以 1.0

关键是在除法之前完成转换。写成 (double)(sum / n) 就晚了——括号里已经先算了整除,再转成 double 只能得到 3.000000。把转换写在哪一步,是这类题的唯一分水岭。

强制转换的写法与风险

C 风格写法是 (double)a,C++ 风格是 static_cast<double>(a),两者在一级二级都算正确,考试用哪个都行。强制转换的意思是「我知道可能有损失,但请按我说的类型来」,编译器不再检查,所以更要用对地方。

还要注意布尔型的规则:任何非零值转成 bool 都是 true,0 转成 false。反过来 true 转成整数是 1,false 是 0,这就是 cout << (5 > 3) 输出 1 的原因。

自编例题

整除和浮点除法的区别

输入两个整数 89 和 90,分别用两种写法求平均分,输出有什么不同?

int a = 89, b = 90;
cout << (a + b) / 2 << endl;    // 89
cout << (a + b) / 2.0 << endl;  // 89.5

第一种写法中 a + b 是 int,除以 int 常量 2 执行整除,179 除以 2 得到 89,余数被丢掉。第二种写法里 2.0 是 double,a + b 先被转换成 double 再相除,结果是 89.5。若想保留小数,可以写成 (a + b) / 2.0 或 (double)(a + b) / 2,两种都至少让一个操作数变成浮点数。强制转换只影响紧随其后的表达式,加括号的位置不同,结果可能完全不同。

相关真题

这块内容在整条路线里的位置:GESP C++ 2 级备考路径。

READY TO START

开始练习

先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。

常见问题

自动转换和强制转换有什么区别?

自动转换由编译器按类型范围自动完成,不需要写转换语法;强制转换由程序员显式指定目标类型,可能丢失精度。

浮点数转整型会四舍五入吗?

不会。强制转换直接丢弃小数部分,例如 (int)3.9 得到 3。需要四舍五入时可以先加 0.5 再转换。

char 和 int 转换要注意什么?

char 转 int 得到的是编码值,'A' 得到 65;int 转 char 只保留低 8 位,超出范围的值会被截断。

本级别其他知识点

官方依据