字符在 C 表达式中自动提升为整数
对,他们是。C99 第 6.3.1.8 节,通常的算术转换:
许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。对于指定的操作数,每个操作数都在不改变类型域的情况下转换为对应的实数类型是公共实数类型的类型。除非另有明确说明,否则公共实数类型也是结果的对应实数类型,如果操作数相同,则其类型域为操作数的类型域,否则为复数。这种模式称为通常的算术转换:
- 首先,如果任一操作数的对应实数类型为 long double,则将另一个操作数转换为对应实数类型为 long double 的类型,而不改变类型域。
- 否则,如果任一操作数的对应实数类型为双精度,则将另一个操作数转换为对应实数类型为双精度的类型,而不改变类型域。
- 否则,如果任一操作数的对应实数类型为浮点数,则将另一个操作数转换为对应实数类型为浮点数的类型,而不改变类型域。62)
- 否则,对两个操作数都执行整数提升。然后将以下规则应用于提升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
- 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数将转换为具有较高等级的操作数的类型。
- 否则,如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
- 否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。
- 否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。
第 6.3.1.1.2 节描述了整数提升:
可以在可以使用 int 或 unsigned int 的表达式中使用以下内容:
- 整数类型的对象或表达式,其整数转换等级小于或等于 int 和 unsigned int 的等级。
- _Bool、int、signed int 或 unsigned int 类型的位域
如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,它将转换为无符号整数。这些被称为整数促销。所有其他类型都不会因整数促销而改变。
a 的等级char
小于或等于a 的等级int
,因此char
包含在此处。
(作为脚注,提到整数提升仅作为通常算术转换的一部分应用于某些参数表达式,应用于一元的操作数+
,-
和~
,以及移位运算符的两个操作数)。
正如评论中提到的,整数提升也在函数调用参数上执行。