“通常的算术转换”和“整数提升”是相同的吗?我读到过“通常的算术转换”被用来使表达式的操作数成为相同类型,而“整数提升”则被用来将小于
int
的类型提升为 int
,但在 MSDN 中,这两个概念都只放在“通常的算术转换”下面。int
的类型提升为 int
,但在 MSDN 中,这两个概念都只放在“通常的算术转换”下面。编号。
通常的算术转换涉及在某些情况下进行整数提升,但这是两种不同的机制:
[C++14:5/10]:
许多二元运算符期望算术或枚举类型的操作数会导致转换,并以类似的方式产生结果类型。其目的是产生一个公共类型,该类型也是结果的类型。这种模式称为通常的算术转换,其定义如下:
- 如果任一操作数为作用域枚举类型(7.2),则不执行转换;如果另一个操作数没有相同的类型,则表达式无效。
- 如果任一操作数为
long double
类型,则将另一个操作数转换为long double
类型。- 否则,如果任一操作数为
double
类型,则将另一个操作数转换为double
类型。- 否则,如果任一操作数为
float
类型,则将另一个操作数转换为float
类型。- 否则,应对两个操作数进行整数提升(4.5)。然后将以下规则应用于晋升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
- 否则,如果两个操作数都具有带符号整数类型或都具有无符号整数类型,则将具有较小整数转换级别的操作数转换为具有更高级别的操作数的类型。
- 否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则应将具有带符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。
- 否则,如果具有带符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数的所有值,则应将具有无符号整数类型的操作数转换为具有带符号整数类型的操作数的类型。
- 否则,应将两个操作数转换为与具有带符号整数类型的操作数的类型相对应的无符号整数类型。
C11中的措辞基本相同。
请注意,整数提升也可能在与通常的算术转换无关的情况下进行,例如位移运算符的LHS操作数;最终,这就是为什么这两个机制具有自己独特名称的原因!
float
到double
)进行提升。此外,它们还可以将有符号值转换为无符号类型。完整规范在[expr]/9中,非常冗长。 - Igor Tandetnik