强制类型转换
概念说明
类型转换表示把一个值按另一种类型去解释,或生成另一种类型的结果。 C 会在很多场景下自动进行隐式转换,但当你需要明确控制计算结果或接口类型时,就会用到显式转换,也就是强制类型转换。
学这一节时,最关键的是理解: 转换能影响“接下来如何计算”,但不能凭空恢复已经丢失的信息。
例如整数除法 5 / 2 的结果已经是整数 2 了,这时候再把它转成 double,得到的也只是 2.0。
真正应该做的是让浮点计算在除法发生之前就介入。
语法/规则
- 强制类型转换的基本形式是
(目标类型)表达式。 - 如果想避免整数除法截断,应该在除法发生前就参与浮点计算。
- 隐式转换会遵循整型提升和常用算术转换等规则,但结果不一定总符合你的直觉。
- 从更大范围的类型转换到更小范围的类型,可能发生截断或精度丢失。
- 指针转换要格外谨慎,错误的目标类型可能让后续解引用产生严重问题。
- 不要为了“让警告消失”而随手加转换,先判断警告是否揭示了真实的设计问题。
示例
| |
输出结果:
| |
在这个例子里,(double)total 让后续的除法进入了浮点运算路径,所以结果不再被整数截断。
常见错误
- 先做完整数除法再去转换,例如
(double)(5 / 2),结果仍然是2.00。 - 误以为强制转换能修复所有精度或溢出问题,实际上很多信息在更早阶段就已经丢失了。
- 为了消除编译警告随手加类型转换,结果把真正的类型设计问题掩盖掉。
- 把不同类型指针强转后直接解引用,却没有确认目标对象的真实类型和对齐要求。
- 从浮点数强转到整数时,忽略小数部分会被截断而不是四舍五入。