算术转换VS积分促销

时间:2015-12-28 02:07:23

标签: c++ integer-promotion

char cval;
short sval;
long lval;
sval + cval; // sval and cval promoted to int
cval + lval; // cval converted to long

这是关于C ++ Primer的一段代码。 我知道sval+cval根据

生成一个int类型
  

将小积分类型转换为更大的积分类型。类型   bool,char,signed char,unsigned char,short和unsigned short   如果该类型的所有可能值都适合int。

,则提升为int

但对于最后一个我无法理解为什么它使用“转换”。为什么cval不会先提升为int,然后int已转换(或者可能已提升,我不确定是否可以将提升用于int到{{1}因为我只看到较小类型的促销定义为long)到int。我在本书的那一部分long直接char没有看到任何解释或例子。
我的理解有什么问题吗?
我是C ++的新手,有人请赐教!非常感谢提前!

2 个答案:

答案 0 :(得分:2)

加法运算符在其操作数上执行所谓的usual arithmetic conversion,其中包括整体促销,然后我们可以进行进一步的转换。目的是产生一种普通类型,如果促销没有实现,则需要进一步转换。

C ++标准草案的5 [expr] 部分对此进行了介绍(强调我的):

  

许多期望算术或枚举类型操作数的二元运算符会导致转换和产生   结果类型以类似的方式。 目的是产生一个共同类型,这也是结果的类型。   此模式称为通常的算术转换,定义如下

并包含以下项目符号:

  
      
  • 否则,两个操作数上的整数促销(4.5)将被执行 .61然后以下   规则应适用于推广的操作数:
  •   

有以下项目符号:

  
      
  • 如果两个操作数具有相同类型,则无需进一步转换

  •   
  • 否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,   具有类型的较小整数转换等级的操作数应转换为该类型   排名较高的操作数

  •   
  • 否则,如果具有无符号整数类型的操作数的等级大于或等于   另一个操作数的类型的等级,带有符号整数类型的操作数应转换为   具有无符号整数类型的操作数的类型。
  •   
  • 否则,如果带有符号整数类型的操作数的类型可以表示的所有值   具有无符号整数类型的操作数的类型,具有无符号整数类型的操作数应为   转换为带有符号整数类型的操作数的类型。
  •   
  • 否则,两个操作数都应转换为对应的无符号整数类型   带有符号整数类型的操作数的类型。
  •   

因此,在促销后的第一种情况下,它们都具有相同的类型( int ),因此无需进一步转换。

在促销后的第二种情况下,他们没有( int和long ),因此需要进一步转换。

答案 1 :(得分:1)

来自C ++ 11标准:

  

4次标准转化

     

1标准转化是具有内置含义的隐式转化。第4条列举了全套这类   转换。标准转换序列是按以下顺序的一系列标准转换:

     

- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换。

     

- 来自以下设置的零次或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,指向成员转换的指​​针以及布尔转换。

     

- 零或一个资格转换。

在表达式中,

cval + lval;

由于cval不属于long类型,因此必须将其转换为long。但是,在应用标准转化的过程中,整合促销优先于转化。因此,cval在转换为int之前会先提升为long