“积分促销”是旧的C90术语,正式的标准术语是整数促销。
整数提升是一条规则,适用于在表达式中将小整数类型(bool、char、short 及其有符号的等价物)用作操作数时。
C11 6.3.1.1/4
如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则将该值转换为 int;否则,它被转换为无符号整数。这些被称为整数提升。整数提升不会改变所有其他类型。
“平衡”是非正式术语,指的是一组称为常用算术转换的规则。它们说明了操作中每个操作数的所有隐式类型提升是如何完成的。请注意,整数提升是常用算术转换的一部分:
C11 6.3.1.8
首先,如果任一操作数的对应实数类型为 long double,则另一个操作数在不改变类型域的情况下转换为对应实数类型为 long double 的类型。
否则,如果任一操作数的对应实数类型为 double,则另一个操作数将在不改变类型域的情况下转换为对应实数类型为 double 的类型。
否则,如果任一操作数的对应实数类型为浮点数,则另一个操作数将在不改变类型域的情况下转换为对应实数类型为浮点数的类型。
否则,将在两个操作数上执行整数提升。然后将以下规则应用于提升的操作数:
如果两个操作数的类型相同,则不需要进一步转换。
否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的类型的操作数转换为具有较大等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将具有有符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。
否则,如果有符号整数类型操作数的类型可以表示无符号整数类型操作数类型的所有值,则将无符号整数类型操作数转换为有符号整数类型操作数的类型。
否则,两个操作数都被转换为与带符号整数类型的操作数的类型对应的无符号整数类型。