我认为你混淆了两件事。提升是将 int/unsigned int “较小”的整数类型值转换为 int 或 unsigned int 的过程。规则的表达有些奇怪(主要是为了充分处理字符),但确保值和符号是守恒的。
然后是通常算术转换的不同概念,通过该概念将算术运算符的操作数转换为通用类型。如果操作数的类型小于 int,则它首先提升操作数(为 int 或无符号),然后通过以下过程选择目标类型(对于整数类型,6.3.1.8/1)
如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数将转换为具有较高等级的操作数的类型。
否则,如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。
否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。
(请注意,ISTR 认为这些规则在 C89 和 C99 之间略有变化)