考纲要求
- 理解自动类型转换的方向: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 位,超出范围的值会被截断。
