“常规算术转换”和“整数提升”是同一件事吗?

3
“通常的算术转换”和“整数提升”是相同的吗?我读到过“通常的算术转换”被用来使表达式的操作数成为相同类型,而“整数提升”则被用来将小于 int 的类型提升为 int,但在 MSDN 中,这两个概念都只放在“通常的算术转换”下面。

你为什么要将非代码格式化为代码呢? - Lightness Races in Orbit
1
通常的算术转换不仅可以进行整数提升,还可以将浮点值(例如floatdouble)进行提升。此外,它们还可以将有符号值转换为无符号类型。完整规范在[expr]/9中,非常冗长。 - Igor Tandetnik
2
请选择一种语言。C和C++是不同的语言。 - Lightness Races in Orbit
它们在C和C++中是不同的东西 :) - M.M
@IgorTandetnik:这已经有将近四年没在[expr]/9里出现了 :P - Lightness Races in Orbit
1个回答

7

编号。

通常的算术转换涉及在某些情况下进行整数提升,但这是两种不同的机制:

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

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

C11中的措辞基本相同。

请注意,整数提升也可能在与通常的算术转换无关的情况下进行,例如位移运算符的LHS操作数;最终,这就是为什么这两个机制具有自己独特名称的原因!


如果两个操作数具有相同的类型,则不需要进一步转换。因此,如果两个操作数的类型为“short”,则它们不会被提升为“int”吗? - John
1
@John。那不是它所说的。它说:“应对两个操作数执行整数提升(4.5)。然后将适用于已提升操作数的以下规则:如果两个操作数具有相同的类型,则不需要进一步转换。”您正在忽略整数提升的影响。 - Lightness Races in Orbit
在MSDN文章中,“整数转换”步骤表明操作数将始终以相同的类型结束,我的意思是“整数转换”不是让两个操作数成为相同类型吗?(我假设“整数转换”和“整数提升”是相同的东西)。 - John
@John:MSDN上的文本基本上是引用了C++标准文本,将短语“整数提升”替换为非标准短语“整数转换”,并删除了后续步骤。我不知道他们为什么这样做。 - Lightness Races in Orbit
@John:别再引用MSDN的文章了!我引用的是标准,这是权威的,它显示该文本不是整数提升的一部分,而是通常的算术转换。 - Lightness Races in Orbit
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接