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

“通常的算术转换”和“整数促销”是一回事吗? 我读过“通常的算术转换”用于使表达式的操作数具有相同的类型,而“整数提升”用于将小于int的类型提升为int ,但在MSDN中 ,这两个概念都放在“通常的算术转换”只。

没有。

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

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

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

C11中的措辞大致相同。

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