跳到主要内容

C 语言类型转换

整形升级

整型升级是指将比 int 类型“窄”的整型类型(如 charshort)提升为至少 int 或者 unsigned int 类型,以便在表达式中参与运算时遵循统一的类型规则。如果 int 可以完整表示源类型的所有值,那么该源类型的值就转换为 int,否则转换为 unsigned int。整形升级属于一种隐式的转换规则,它方便了开发者,比如在比较 charint 时、将 char 作为 int 传入函数时,可以省略类型转换。尽管如此,操作 int 以下的类型的数据的时候,还是注意类型的手动转换,以避免潜在的问题。

寻常算数转换

  • 首先,如果其中一个操作数的类型是 long double,那么另一个操作数也被转换为 long double
  • 其次,如果其中一个操作数的类型是 double,那么另一个操作数也被转换为 double
  • 最后,如果其中一个操作数的类型是 float,那么另一个操作数也被转换为 float
  • 否则,两个操作数进行整型升级,并执行下面的规则:
    • 如果其中一个操作数的类型是 unsigned long int,那么另一个操作数也被转换为 unsigned long int
    • 其次,如果其中一个操作数的类型是 long int,而另一个操作数的类型是 unsigned int,如果 long int 能够完整表示 unsigned int 的所有值,那么 unsigned int 类型操作数被转换为 long int;如果 long int 不能完整表示 unsigned int 的所有值,那么两个操作数都被转换为unsigned long int
    • 再次,如果其中一个操作数的类型是 long int,那么另一个操作数被转换为 long int
    • 最后,如果其中一个操作数的类型是 unsigned int,那么另一个操作数被转换为 unsigned int
    • 如果所有以上情况都不属于,那么两个操作数都为 int

结合整合升级,总结一下转换的规则:

  1. 优先转换成长度更长的、精度更高的类型
  2. 如果 signed 能够存下数据,优先 singed 否则 unsigned

尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。……只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。——《C 专家编程》