积分提升和平衡有什么区别。我们是否可以总结这两条规则,即任何类型在执行任何操作之前都转换为至少 int 或 unsigned int 类型(逻辑运算符 &&、||、! 除外),如果任何操作数的类型更大,则转换为更大的类型比 int ?
2 回答
“积分促销”是旧的C90术语,正式的标准术语是整数促销。
整数提升是适用于任何时候将小整数类型(bool、char、short 及其有符号等价物)用作表达式中的操作数的规则。
C11 6.3.1.1/4
如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为 int;否则,它将转换为无符号整数。这些被称为整数促销。整数提升不会改变所有其他类型。
“平衡”是一个非正式术语,指的是一组称为通常算术转换的规则。它们说明了操作中每个操作数的所有隐式类型提升是如何完成的。请注意,整数提升是通常算术转换的一部分:
C11 6.3.1.8
首先,如果任一操作数的对应实数类型为 long double,则将另一个操作数转换为对应实数类型为 long double 的类型,而不改变类型域。
否则,如果任一操作数的对应实数类型为双精度,则将另一个操作数转换为对应实数类型为双精度的类型,而不改变类型域。
否则,如果任一操作数的对应实数类型为浮点数,则将另一个操作数转换为对应实数类型为浮点数的类型,而不改变类型域。
否则,对两个操作数都执行整数提升。然后将以下规则应用于提升的操作数:
如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数将转换为具有较高等级的操作数的类型。
否则,如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数类型的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。
否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。
标准中有两个不同的东西,但没有一个叫做平衡:
如果 an
int
可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为int
; 否则,将其转换为unsigned int
. 这些被称为 整数促销.58) 所有其他类型都不受整数促销的影响。
……
6.3.1.8 通常的算术转换许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。
应用于不同类型表达式的运算符的一般思想是将操作数转换为精度损失较小的类型。例如 if a
is float
and b
is double,因为总和在加法之前a + b
a
被转换为double
。类似 if c
isunsigned long
它首先转换为double
for c + b
。