[英]Why is the type here deduced to be uint32_t?
以下代码将auto推导为uint32_t。 我试图理解为什么会这样。
auto value = a + b * c;
其中a是int32_t,b是uint32_t,c是int。
类型转换规则有时有点怪异。 每种类型都有一个等级,但是每个平台都可以根据需要进行转换,通常只有很少的规则。
securecoding有一个很好的总结:
整数转换等级
每个整数类型都有一个整数转换等级,该等级确定如何执行转换。 排名基于以下概念:每种整数类型至少包含与排名在其下方的类型一样多的位。 C标准第6.3.1.1节[ISO / IEC 9899:2011]中定义了以下确定整数转换等级的规则:
即使两个有符号整数类型具有相同的表示形式,也不应具有相同的等级。
有符号整数类型的等级应大于精度较低的任何有符号整数类型的等级。
long long int的等级应大于long int的等级,后者应大于int的等级,后者应大于short int的等级,后者应大于有符号字符的等级。
任何无符号整数类型的等级应等于相应的有符号整数类型的等级(如果有)。
任何标准整数类型的秩应大于相同宽度的任何扩展整数类型的秩。
字符的等级应等于有符号字符和无符号字符的等级。
_Bool的等级应小于所有其他标准整数类型的等级。
任何枚举类型的等级应等于兼容整数类型的等级。
相对于具有相同精度的另一个扩展有符号整数类型的任何扩展有符号整数类型的等级都是实现定义的,但是仍然要遵循其他规则来确定整数转换等级。
对于所有整数类型T1,T2和T3,如果T1的等级高于T2,并且T2的等级高于T3,则T1的等级高于T3。
在通常的算术转换中使用整数转换等级来确定需要进行哪些转换以支持对混合整数类型的运算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.