2.6 强制类型转换

本篇学习隐式转换与显式转换的区别,并能在计算、格式化和函数调用中正确使用类型转换。

强制类型转换

概念说明

类型转换表示把一个值按另一种类型去解释,或生成另一种类型的结果。 C 会在很多场景下自动进行隐式转换,但当你需要明确控制计算结果或接口类型时,就会用到显式转换,也就是强制类型转换。

学这一节时,最关键的是理解: 转换能影响“接下来如何计算”,但不能凭空恢复已经丢失的信息。

例如整数除法 5 / 2 的结果已经是整数 2 了,这时候再把它转成 double,得到的也只是 2.0。 真正应该做的是让浮点计算在除法发生之前就介入。

语法/规则

  1. 强制类型转换的基本形式是 (目标类型)表达式
  2. 如果想避免整数除法截断,应该在除法发生前就参与浮点计算。
  3. 隐式转换会遵循整型提升和常用算术转换等规则,但结果不一定总符合你的直觉。
  4. 从更大范围的类型转换到更小范围的类型,可能发生截断或精度丢失。
  5. 指针转换要格外谨慎,错误的目标类型可能让后续解引用产生严重问题。
  6. 不要为了“让警告消失”而随手加转换,先判断警告是否揭示了真实的设计问题。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>

int main(void) {
    int total = 5;
    int count = 2;
    double average = (double)total / count;

    printf("average = %.2f\n", average);
    return 0;
}

输出结果:

1
average = 2.50

在这个例子里,(double)total 让后续的除法进入了浮点运算路径,所以结果不再被整数截断。

常见错误

  1. 先做完整数除法再去转换,例如 (double)(5 / 2),结果仍然是 2.00
  2. 误以为强制转换能修复所有精度或溢出问题,实际上很多信息在更早阶段就已经丢失了。
  3. 为了消除编译警告随手加类型转换,结果把真正的类型设计问题掩盖掉。
  4. 把不同类型指针强转后直接解引用,却没有确认目标对象的真实类型和对齐要求。
  5. 从浮点数强转到整数时,忽略小数部分会被截断而不是四舍五入。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字