“通常的算术转换”和“整数促销”是一回事吗?

时间:2015-01-25 23:38:50

标签: c++ c integer-promotion

“通常的算术转换”和“整数促销”是否相同?我已经读过“通常的算术转换”用于使表达式的操作数具有相同的类型,而“整数提升”用于提升小于intint的类型,但是MSDN这两个概念都只放在“通常的算术转换”下。

1 个答案:

答案 0 :(得分:5)

通常的算术转换在某些情况下涉及整体推广,但这是两个不同的机制:

  

[C++14: 5/10]:许多期望算术或枚举类型操作数的二元运算符会以类似的方式引起转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。 此模式称为通常的算术转换,其定义如下:

     
      
  • 如果任一操作数是作用域枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式不正确。
  •   
  • 如果任一操作数的类型为long double,则另一个操作数应转换为long double
  •   
  • 否则,如果任一操作数为double,则另一个操作数应转换为double
  •   
  • 否则,如果任一操作数为float,则另一个操作数应转换为float
  •   
  • 否则,应对两个操作数执行整数提升(4.5) 61 然后,以下规则应适用于提升的操作数:   
        
    • 如果两个操作数具有相同的类型,则无需进一步转换。
    •   
    • 否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则具有较小整数转换等级类型的操作数应转换为具有更高等级的操作数类型。
    •   
    • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型。
    •   
    • 否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数应转换为带有符号整数的操作数的类型类型。
    •   
    • 否则,两个操作数都应转换为无符号整数类型,对应于带有符号整数类型的操作数类型。
    •   
  •   

C11中的措辞大致相同。

请注意,整体促销也可以在与通常的算术转换无关的情况下执行,例如, LHS操作数的位移;最终,这就是为什么这两种机制都有各自不同的名称!