B29
类型转换:自动升级与强制转换
引入
章前总览 不同类型混在一起运算时,C++ 会先统一类型。自动转换朝精度高的走;不够用时再用强制转换。
本节要点:
- 常用基本类型一览(拓展)
- 自动转换:朝 double / int 等“升学”
- 强制转换:(double)a 或 double(a)
1 C1. 常用基本类型(拓展阅读)
一级常考 int、double、char、float。还有 short、long、bool 等,知道“占字节、有取值范围”即可。
注意溢出
- 超出类型取值范围会发生溢出;编译和运行往往不报错,结果却错。
int就是signed int;方括号里可省略的写法见教材表。- 字节是存储基本单位(回顾第2章存储单位)。
2 C2. 自动类型转换
表达式里出现不同类型时,先转成同一类型再算,原则是朝精度更高的类型转,尽量不丢数据。
常见规则(了解)
- 两个
float运算也会先升到double。 - 两个
char运算会先变成int。 int遇上double:int 先升成 double,再运算。
补充说明
不推荐
int d = 5;
double r = d / 2; // r = 2(错)
问题:d 和 2 都是整数,整除后再赋给 double,小数已经丢了。
推荐写法
double r = d / 2.0; // 执行时 d 自动升为 double
优点:触发自动转换,半径正确。
3 C3. 强制类型转换
需要“主动”改类型时用强制转换。两种写法等价:
写法
(类型名)(表达式) // 例:(double)a
类型名(表达式) // 例:double(a)
int a = 3, b = 4;
double d1 = 1.0 * a / b; // 0.75
double d2 = (double)a / b; // 0.75
- 比喻:自动转换像正常升级;强制转换像“跳级”。
int(3.14)得到 3(截断小数,不是四舍五入)。char(c+4):先按整数加,再转回字符输出。
易错
0.0 + a/b(a、b 为 int)先算整数除法,再加 0.0,得不到小数商。- 应写成
(a+0.0)/b、a/(0.0+b)或(double)a/b。
小结
要小数商,记住三板斧:
1.0 * a / b
a / 2.0
(double)a / b 或 double(a) / b
✓
里程碑达成:
下一节做第5章基础知识自测(选择题 + 判断题)。