C 标准说(6.3.1.1 布尔值、字符和整数):
1 每个整数类型都有一个整数转换等级,定义如下:
- 任何两个有符号整数类型都不应具有相同的等级,即使它们具有相同的等级 代表。
- 有符号整数类型的等级应大于任何有符号整数的等级 打字精度较低。
- long long int 的rank 应大于long int 的rank,即 应大于 int 的等级,而 int 的等级应大于 Short 的等级 int,应大于有符号字符的排名。
- 任何无符号整数类型的等级应等于相应的等级 有符号整数类型(如果有)。
- 任何标准整数类型的等级应大于任何扩展的等级 具有相同宽度的整数类型。
- char 的等级应等于signed char 和unsigned char 的等级。
- _Bool 的等级应小于所有其他标准整数类型的等级。
- 任何枚举类型的等级应等于兼容整数类型的等级 (见 6.7.2.2)。
- 任何扩展有符号整数类型相对于另一个扩展有符号整数类型的排名 具有相同精度的整数类型是实现定义的,但仍受 确定整数转换等级的其他规则。
- 对于所有整数类型 T1、T2 和 T3,如果 T1 的秩大于 T2 并且 T2 有 等级高于 T3,则 T1 的等级高于 T3。
这意味着在整数类型系统中不能存在具有相同秩的两种类型(有符号或无符号)。然而,更进一步:
在表达式中,无论 int 或 unsigned int 可能出现的地方,都可以使用以下内容: 使用:
- 具有整数类型(除 int 或 unsigned int 之外)的对象或表达式 其整数转换等级小于或等于 int 的等级并且 无符号整数。
怎么可能一些低等类型也会有相同的等级?
根据平台的不同,
enum
类型的对象可以是“具有整数类型(int
或无符号int
除外)的对象或表达式,其整数转换等级等于int
的等级”和unsigned int
。”