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

时间:2012-08-23 14:50:53

标签: c c99 c89 misra

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

2 个答案:

答案 0 :(得分:4)

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

  

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

...

  

6.3.1.8常规算术转换许多期望算术类型操作数的运算符会导致转换并产生结果类型   以类似的方式。目的是确定一个共同的实际类型   操作数和结果。

应用于不同类型表达式的运算符的一般思想是将操作数转换为精度损失较少的类型。例如,如果afloatb为加倍,则总和a + b a会在添加之前转换为double。类似如果cunsigned long,则double首先将c + b转换为{{1}}。

答案 1 :(得分:4)

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

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

C11 6.3.1.1/4

  

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

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

C11 6.3.1.8

  

首先,如果任一操作数的相应实数类型很长   double,转换另一个操作数,不更改类型域,   到对应的实数类型为long double的类型。

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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