以下代码推断auto to uint32_t。我想知道为什么会这样。
auto value = a + b * c;
其中a是int32_t,b是uint32_t,c是int。
答案 0 :(得分:-1)
类型转换规则有时候有点奇怪。 每种类型都有一个等级,但每个平台都可以实现适合它们的转换,通常只有很少的规则。
securecoding有一个很好的总结:
整数转化率
每个整数类型都有一个整数转换等级来确定如何 进行转换。排名基于这一概念 每个整数类型至少包含与排序类型一样多的位 在它下面。以下规则用于确定整数转换排名 在C标准,第6.3.1.1节[ISO / IEC 9899:2011]中定义:
没有两个有符号整数类型具有相同的等级,即使它们具有相同的表示。
有符号整数类型的等级应大于精度较低的任何有符号整数类型的等级。
long long int的等级应大于long int的等级,该等级应大于int的等级,其应为 大于短int的等级,大于等于 签名字符的排名。
任何无符号整数类型的等级应等于相应的有符号整数类型的等级(如果有)。
任何标准整数类型的等级应大于具有相同宽度的任何扩展整数类型的等级。
char的等级应等于signed char和unsigned char的等级。
_Bool的等级应小于所有其他标准整数类型的等级。
任何枚举类型的等级应等于兼容整数类型的等级。
任何扩展有符号整数类型相对于另一个具有相同精度的扩展有符号整数类型的等级 实现定义但仍受其他规则约束 确定整数转换排名。
对于所有整数类型T1,T2和T3,如果T1的排名高于T2且T2的排名高于T3,则T1的排名高于T3。
整数转换等级用于通常的算术运算 转换以确定需要进行的转化 支持对混合整数类型的操作。