C语言隐式类型转换规则咨询:整数规则完整性及浮点转换规则
关于整数与浮点隐式转换规则的解答
一、你找到的整数转换规则是否完整?
你列出的是双目算术运算中的常用算术转换规则,并非全部整数隐式转换规则。完整的整数隐式转换还涵盖以下场景:
- 赋值转换:当把一个整数类型的值赋值给另一个整数类型变量时,右值会被转换为左值的类型(例如
int赋值给char会截断高位,unsigned int赋值给signed int若超出范围会产生未定义行为) - 函数实参转换:传递给函数的实参,会自动转换为函数形参的类型(例如
short或char会被提升为int,这属于整数提升的一部分) - 条件表达式转换:在
if、while等条件判断中,布尔值、字符等会转换为int类型(例如false转为0,true转为1) - 单目运算转换:单目运算符(如
+、-)作用于char、short时,会先将其提升为int类型再运算
二、浮点类型的隐式转换规则
浮点类型的隐式转换主要分为算术运算转换和其他场景(赋值、参数传递等)的转换:
1. 算术运算中的浮点转换
- 若两个操作数类型相同,无需转换
- 若类型不同,按精度从低到高转换:
float→double→long double,精度较低的操作数会被转换为精度较高的类型,以尽可能保留精度 - 当整数与浮点类型混合运算时,整数会先转换为对应的浮点类型(例如
int转float,long long转double),再参与浮点运算
2. 其他场景的浮点隐式转换
- 赋值转换:
- 浮点值赋值给整数类型:截断小数部分(例如
3.9赋值给int得到3),若浮点值超出整数类型范围,会产生未定义行为 - 整数值赋值给浮点类型:会被转换为对应的浮点表示,若整数超出浮点类型的精确表示范围,会转为近似值
- 浮点值赋值给整数类型:截断小数部分(例如
- 函数实参转换:实参的浮点类型会转换为形参的类型,规则与赋值转换一致
- 条件表达式转换:浮点值转换为布尔值时,
0.0(包括±0.0)转为false,所有非零浮点值转为true
内容的提问来源于stack exchange,提问作者Cblue X
相关产品推荐
相关产品推荐

