隐式类型转换规则(寻常算术转换)
C语言中,当二元运算符的两个操作数类型不同时,编译器会自动将它们转换为相同类型。核心原则是:值域小的向值域大的转换。但在某些情况下,两个操作数都需要转换。
转换规则总览
| 场景 | 转换方向 |
|---|---|
| 浮点数 + 整数 | 整数绝对转换为浮点数 |
| 两个都是浮点数 | long double > double > float |
| 两个都是整数 | long long > long > int > short > char |
编译器逐级判定规则(按顺序匹配)
- 如果其中一个是
long double:把另外一个转换为long double。 - 否则,如果其中一个是
double:把另外一个转换为double。 - 否则,如果其中一个是
float:把另外一个转换为float。 - 否则(两个都是整数):
- 如果两个操作数都是带符号或都是无符号整数,把级别较低的操作数转换为级别较高的操作数的类型。
- 无符号整数类型的级别从低到高与对应带符号类型相同:
signed char/unsigned char→short/unsigned short→int/unsigned int→long/unsigned long→long long/unsigned long long - 所以
unsigned int的级别与int相同。
- 否则,如果带符号整数类型的级别低于无符号整数类型的级别:把带符号整数转换为无符号整数类型。
- 否则,如果带符号整数类型的值域包含了无符号整数类型所表示的所有值:把无符号整数类型转换为带符号整数类型。
- 否则:两个操作数都转换为带符号整数类型对应的无符号整数类型。
Previous: 隐式类型转换
Next: 赋值语句中的隐式类型转换