转化排名在6.3.1.1/1
中定义:
每个整数类型的整数转换等级定义如下:
-两种有符号整数类型均不得具有相同的等级,即使它们 具有相同的表示形式。
—有符号整数类型的等级应大于的等级。 任何精度较低的带符号整数类型。
-
long long int
的等级应大于long int
的等级,其应大于int
的等级,其应为 大于short int
的等级,该等级应大于 排名signed char
。-任何无符号整数类型的等级应等于 相应的带符号整数类型(如果有)。
-任何标准整数类型的等级均应大于等级 具有相同宽度的任何扩展整数类型。
-字符的等级应等于有符号字符和无符号字符的等级 字符。
-
_Bool
的等级应小于所有其他等级 标准整数类型。-任何枚举类型的等级均应等于 兼容的整数类型(请参阅 6.7.2.2)。
-任何扩展的带符号整数类型相对于另一种的等级 具有相同精度的扩展有符号整数类型为 实施定义的,但仍然要遵守其他规则 确定整数转换等级。
-对于所有
T1
,T2
和T3
的整数类型,如果T1
的排名更高 比T2
和T2
的排名大于T3
,那么T1
的排名更大 排名高于T3
。
有一个关于有符号整数类型的规则:
有符号整数类型的等级应大于的等级。 任何精度较低的带符号整数类型。
问题:精度更高的扩展无符号整数类型能否具有较小的整数转换等级?
考虑size_t
和unsigned int
。第一个是扩展的整数类型,并且如果size_t
的整数转换等级小于unsigned int
,则对<{1}}应用整数提升损失。
答案 0 :(得分:3)
首先,size_t
通常不是扩展的整数类型,而对于其他现有的无符号整数类型类型,则是typedef
。即使如此,它的排名也可以小于或大于unsigned int
。其次,标准在6.3.1.1p3中说
- 整数促销保留包括符号在内的价值。
即因此,具有大于unsigned int
的值位的无符号整数类型的转换等级不能小于unsigned int
,否则整数提升的子句将无效。
当然,正如Kamil Cuk指出的那样,6.2.5p8 nails it:
8对于具有相同符号和不同整数转换等级(请参见6.3.1.1)的任何两个整数类型,具有较小整数转换等级的类型的值的范围是另一种类型的值的子范围。
我相信您将usual arithmetic conversions与整数促销混淆了。通常的算术转换会丢失正负号并修改负负整数的值。