“通常的算术转换”和“整数提升”是同一回事吗?我读过“通常的算术转换”用于使表达式的操作数具有相同的类型,而“整数提升”用于提升小于的类型int
to int
, 但在MSDN https://msdn.microsoft.com/en-us/library/3t4w2bkb.aspx这两个概念都只放在“通常的算术转换”下。
No.
The 常见的算术转换在某些情况下涉及积分晋升,但这是两种独立的机制:
[C++14: 5/10]:
许多需要算术或枚举类型操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为常见的算术转换,其定义如下:
- 如果任一操作数是作用域枚举类型 (7.2),则不执行任何转换;如果另一个操作数没有相同的类型,则表达式的格式错误。
- 如果任一操作数的类型为
long double
,另一个应转换为long double
.
- 否则,如果任一操作数是
double
,另一个应转换为double
.
- 否则,如果任一操作数是
float
,另一个应转换为float
.
-
Otherwise, the integral promotions (4.5) shall be performed on both operands.61 Then the following rules shall be applied to the promoted operands:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
- 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数应转换为具有较大等级的操作数的类型。
- 否则,如果无符号整数类型操作数的秩大于或等于另一个操作数类型的秩,则有符号整数类型操作数应转换为无符号整数类型操作数的类型。
- 否则,如果有符号整型操作数的类型可以表示无符号整型操作数的所有值,则将无符号整型操作数转换为有符号整型操作数的类型。
- 否则,两个操作数都应转换为与有符号整数类型操作数的类型相对应的无符号整数类型。
C11 中的措辞大致相同。
请注意,积分提升也可以在与通常的算术转换无关的情况下执行,例如移位的 LHS 操作数;最终,这就是为什么这两种机制有自己不同的名称!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)