关于C标准中整数转换秩描述是否存在不准确之处的问询
关于C标准整数转换秩的疑问解答
首先来看C标准6.3.1.1节(布尔型、字符型与整型)中关于整数转换秩的核心规则:
1 每个整型都有一个整数转换秩,定义如下:
- 任何两个有符号整型的秩都不相同,即使它们的表示方式一致。
- 有符号整型的秩应大于任何精度更低的有符号整型的秩。
- long long int的秩大于long int,long int大于int,int大于short int,short int大于signed char。
- 任何无符号整型的秩应等于对应的有符号整型(若存在)的秩。
- 任何标准整型的秩应大于任何相同宽度的扩展整型的秩。
- char的秩等于signed char和unsigned char的秩。
- _Bool的秩小于所有其他标准整型的秩。
- 任何枚举类型的秩等于其兼容整型的秩(见6.7.2.2节)。
- 精度相同的两个扩展有符号整型之间的相对秩由实现定义,但仍需遵循其他整数转换秩的判定规则。
- 对于所有整型T1、T2、T3,若T1的秩大于T2,T2的秩大于T3,则T1的秩大于T3。
从这些规则来看,标准整型之间确实不存在秩相同的情况,但标准后续的“小于或等于”表述并非无的放矢,主要存在两类符合条件的类型:
- 枚举类型
根据规则,枚举类型的秩等于其兼容整型的秩。如果某个枚举类型的兼容整型是int,那么这个枚举类型的秩就和int完全相同,但它本身不属于int或unsigned int类型,完全符合“除外”后的条件。比如定义:
enum Color { RED, GREEN, BLUE };
在多数实现中,enum Color的兼容整型是int,因此它的秩和int相同,却能在允许使用int的表达式中直接使用。
- 实现定义的特殊整型场景
虽然标准明确标准整型的秩大于相同宽度的扩展整型,但不排除某些实现中存在和int秩相同的非标准整型(比如特定扩展类型的兼容规则使其秩与int一致)。标准用“小于或等于”的措辞,是为了覆盖所有可能的实现场景,保证标准的通用性和严谨性,同时也为未来的实现或特殊场景预留了空间。
内容的提问来源于stack exchange,提问作者Evgeny Ilyin
相关产品推荐
相关产品推荐

