“通常的算术转换”和“整数提升”是一回事吗?我读过“通常的算术转换”用于使表达式的操作数具有相同的类型,而“整数提升”用于提升小于的类型int
to的类型int
,但在MSDN中,这两个概念都放在“通常算术转换”。
问问题
1023 次
1 回答
6
不。
在某些情况下,通常的算术转换涉及整数提升,但这是两种独立的机制:
[C++14: 5/10]:
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
- 如果任一操作数属于范围枚举类型 (7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
- 如果任一操作数为 类型
long double
,则另一个应转换为long double
。- 否则,如果任一操作数为
double
,则另一个应转换为double
。- 否则,如果任一操作数为
float
,则另一个应转换为float
。- 否则,应在两个操作数上执行积分提升 (4.5)。61那么以下规则应适用于提升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
- 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数应转换为具有较大等级的操作数的类型。
- 否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
- 否则,如果带符号整数类型的操作数的类型可以表示无符号整数类型的操作数类型的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。
- 否则,两个操作数都应转换为与带符号整数类型的操作数类型对应的无符号整数类型。
C11 中的措辞大致相同。
请注意,积分提升也可以在与通常的算术转换无关的情况下执行,例如移位的 LHS 操作数;归根结底,这就是为什么这两种机制有自己不同的名称的原因!
于 2015-01-25T23:46:45.640 回答