C++隐式类型转换疑问:unsigned与float相加为何优先转float
问题解答
这个行为是C++标准规定的**常用算术转换(Usual Arithmetic Conversions)**规则决定的,和两种类型的占用空间大小没有直接关系:
转换规则优先级
当不同算术类型的操作数执行二元运算时,会先按如下优先级做类型转换,将两个操作数统一为同一个公共类型后再执行运算:
- 若存在
long double类型操作数:另一个操作数直接转为long double - 否则若存在
double类型操作数:另一个操作数直接转为double - 否则若存在
float类型操作数:另一个操作数直接转为float - 仅当所有操作数都是整数类型时,才会执行整数提升、整数类型转换逻辑
你的代码中存在float类型的操作数fval,直接触发第三条规则,unsigned int类型的ui会被隐式转为float,因此最终运算结果的类型是float。
规则设计逻辑
标准之所以把浮点类型的转换优先级设得比所有整数类型都高,是做了实用性的权衡:
- 如果反过来把浮点类型转为整数,会直接截断丢弃小数部分,若浮点值超出整数的取值范围还会触发未定义行为,完全改变运算的数学语义,对绝大多数场景来说都不符合开发者的预期,比如你的示例中
1+2.5如果按整数逻辑计算结果会变成3,和数学上的3.5偏差极大 - 整数转浮点虽然会对超出精度范围的大整数产生精度损失,但至少会保留值的数量级,不会直接出现语义级的错误,危害比浮点转整数小很多
内容的提问来源于stack exchange,提问作者schwillr
相关产品推荐
相关产品推荐

