C中的Integral Promotion和Balancing有什么区别?

积分促销和平衡之间有什么区别。 我们可以在执行任何操作之前将任何类型转换为atleast int或unsigned int类型(逻辑运算符&&,||,!除外)以及更大类型(如果任何操作数的类型更大)比int?

标准中有两个不同的东西,但没有一个称为平衡:

如果int可以表示原始类型的所有值(由宽度限制,对于位字段),该值将转换为int ; 否则,它将转换为unsigned int 。 这些被称为整数促销 .58)所有其他类型由整数促销不变。

….

6.3.1.8常规算术转换许多期望算术类型操作数的运算符会以类似的方式引起转换并产生结果类型。 目的是确定操作数和结果的通用实数类型。

应用于不同类型表达式的运算符的一般思想是将操作数转换为精度损失较少的类型。 例如,如果afloat并且b是double,则a + b a在加法之前被转换为double 。 类似,如果cunsigned long ,则首先将其转换为c + b double

“整体促销”是旧的C90术语,正式的标准术语是整数促销

整数提升是一种规则,只要将小整数类型(bool,char,short及其带符号的等价物)用作表达式中的操作数,该规则就适用。

C11 6.3.1.1/4

如果int可以表示原始类型的所有值(由宽度限制,对于位字段),该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。 整数促销不会更改所有其他类型。

“平衡”是指一组称为通常算术转换的规则的非正式术语。 它们说明了如何完成操作中每个操作数的所有隐式类型提升。 请注意,整数提升是通常的算术转换的一部分:

C11 6.3.1.8

首先,如果任一操作数的相应实数类型是long double,则另一个操作数在不改变类型域的情况下被转换为其对应的实类型为long double的类型。

否则,如果任一操作数的对应实数类型为double,则将另一个操作数转换为对应的实类型为double的类型,而不更改类型域。

否则,如果任一操作数的相应实数类型为float,则另一个操作数在不更改类型域的情况下转换为对应的实类型为float的类型。

否则,将对两个操作数执行整数提升。 然后将以下规则应用于提升的操作数:

如果两个操作数具有相同的类型,则不需要进一步转换。

否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型。

否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。

否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。

否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。