【发布时间】:2016-04-24 07:51:32
【问题描述】:
以下代码将 auto 推导出为 uint32_t。我试图理解为什么会这样。
auto value = a + b * c;
其中 a 是 int32_t,b 是 uint32_t,c 是 int。
【问题讨论】:
-
uint32_t的转化排名高于int32_t和(在您的系统上)int
标签: c++ c++11 type-deduction
以下代码将 auto 推导出为 uint32_t。我试图理解为什么会这样。
auto value = a + b * c;
其中 a 是 int32_t,b 是 uint32_t,c 是 int。
【问题讨论】:
uint32_t 的转化排名高于int32_t 和(在您的系统上)int
标签: c++ c++11 type-deduction
类型转换规则有时有点奇怪。 每种类型都有一个等级,但每个平台都可以实现适合它们的转换,通常只有很少的规则。
securecoding 有一个很好的总结:
整数转化排名
每个整数类型都有一个整数转换等级,它决定了如何 进行转换。排名基于以下概念 每个整数类型至少包含与排序的类型一样多的位 在它下面。以下规则用于确定整数转换等级 在 C 标准的 6.3.1.1 [ISO/IEC 9899:2011] 子条款中定义:
没有两个有符号整数类型具有相同的等级,即使它们具有相同的表示。
有符号整数类型的等级应大于任何精度较低的有符号整数类型的等级。
long long int 的rank 应该大于long int 的rank,long int 的rank 应该大于int 的rank,应该是 大于 short int 的秩,应大于 有符号字符的等级。
任何无符号整数类型的等级应等于相应有符号整数类型的等级,如果有的话。
任何标准整数类型的秩都应大于任何具有相同宽度的扩展整数类型的秩。
char 的秩应等于signed char 和unsigned char 的秩。
_Bool 的等级应小于所有其他标准整数类型的等级。
任何枚举类型的等级都应等于兼容整数类型的等级。
任何扩展有符号整数类型相对于另一个具有相同精度的扩展有符号整数类型的等级是 实现定义,但仍受制于其他规则 确定整数转换等级。
对于所有整数类型 T1、T2 和 T3,如果 T1 的秩大于 T2,T2 的秩大于 T3,则 T1 的秩大于 T3。
整数转换秩用在通常的算术中 转换以确定需要进行哪些转换 支持对混合整数类型的操作。
【讨论】: