C 语言类型转换
整形升级
整型升级是指将比 int 类型“窄”的整型类型(如 char、short)提升为至少 int 或者 unsigned int 类型,以便在表达式中参与运算时遵循统一的类型规则。如果 int 可以完整表示源类型的所有值,那么该源类型的值就转换为 int,否则转换为 unsigned int。整形升级属于一种隐式的转换规则,它方便了开发者,比如在比较 char 和 int 时、将 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
- 如果其中一个操作数的类型是
结合整合升级,总结一下转换的规则:
- 优先转换成长度更长的、精度更高的类型
- 如果
signed能够存下数据,优先singed否则unsigned
尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。……只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。——《C 专家编程》