【问题标题】:Arithmetic conversion VS integral promotion算术转换 VS 积分提升
【发布时间】:2016-04-01 21:52:06
【问题描述】:
char cval;
short sval;
long lval;
sval + cval; // sval and cval promoted to int
cval + lval; // cval converted to long

这是一段关于 C++ Primer 的代码。 我知道sval+cval根据

生成一个int类型

将较小的整数类型转换为较大的整数类型。类型 bool、char、signed char、unsigned char、short 和 unsigned short 是 如果该类型的所有可能值都适合 int,则提升为 int。

但对于最后一个,我不明白为什么它使用“转换”。为什么cval 没有先提升为int 然后int 转换(或者可能提升我不确定提升是否可以从int 使用到long,因为我只看到较小的提升定义键入int) 到long。在本书的那部分,我没有直接看到charlong 的任何解释或示例。
我的理解有什么问题吗?
我是C ++的新手,请赐教!非常感谢!

【问题讨论】:

    标签: c++ integer-promotion


    【解决方案1】:

    加法运算符在其操作数上执行所谓的usual arithmetic conversion,其中可以包括整数提升,然后我们可以进行进一步的转换。目的是产生一个通用类型,如果促销没有实现,则需要进一步转换。

    C++ 标准草案的5[expr] 部分对此进行了介绍(emphasis mine):

    许多期望算术或枚举类型操作数的二元运算符会导致转换和产生 结果类型以类似的方式。 目的是产生一个通用类型,这也是结果的类型。 这种模式称为通常的算术转换,其定义如下

    并包括以下项目符号:

    • 否则,应在两个操作数上执行积分提升 (4.5)。61 然后以下 规则应应用于提升的操作数:

    其中包含以下项目符号:

    • 如果两个操作数具有相同的类型,则无需进一步转换

    • 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则 具有较小整数转换等级的类型的操作数应转换为 具有更高等级的操作数

    • 否则,如果具有无符号整数类型的操作数的秩大于或等于 其他操作数类型的等级,带符号整数类型的操作数应转换为 无符号整数类型的操作数的类型。
    • 否则,如果带符号整数类型的操作数的类型可以表示所有的值 无符号整数类型的操作数的类型,无符号整数类型的操作数应 转换为带符号整数类型的操作数的类型。
    • 否则,两个操作数都应转换为对应的无符号整数类型 带符号整数类型的操作数的类型。

    因此,在促销后的第一种情况下,它们都具有相同的类型(int),因此不需要进一步转换。

    在促销后的第二种情况下,它们不会(int 和 long),因此需要进一步转换。

    【讨论】:

    • 感谢您的努力!
    【解决方案2】:

    来自 C++11 标准:

    4 次标准转换

    1 标准转换是具有内置含义的隐式转换。第 4 条列举了完整的此类 转换。标准转换序列是按以下顺序进行的标准转换序列:

    - 从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。

    - 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员的指针转换和布尔转换。

    — 零个或一个资格转换。

    在表达式中,

    cval + lval;
    

    由于cval 不是long 类型,它必须转换为long。但是,在应用标准转换的过程中,整体提升领先于转换。因此,cval 在转换为long 之前首先被提升为int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多