【问题标题】:What's the difference between integer promotions and integer conversions in C++C ++中整数提升和整数转换有什么区别
【发布时间】:2011-01-09 17:24:06
【问题描述】:

C++ 标准的第 4.5 节(整数提升)讨论了将整数类型转换为更高等级的类型的具体情况。

C++ 标准的第 4.7 节(积分转换)以 (bullet 4.7.1) 开头:

整数类型的右值可以转换为另一种整数类型的右值。枚举类型的右值可以转换为整数类型的右值。

据我了解,4.5 中描述的转换(可能除了项目符号 4.5.3(枚举)之外)可以单独使用 4.7 部分中的技术执行:4.5.1 和 4.5.2 完全被 4.7 覆盖。 1个; 4.7.4 涵盖了 4.5.4。那么整个 4.5 部分的目的是什么?它启用了哪些额外的转换?也许我错过了一些限制?

附:我正在阅读标准的 C++03 版本。

【问题讨论】:

    标签: c++ implicit-conversion integer-promotion


    【解决方案1】:

    认为这种区别很重要,因为两者不属于相同的转化类别并且具有不同的排名(参见 13.3.3.1 .1,标准转换序列)。在重载决议方面,排名会有所不同:

    标准转换序列按其等级排序:完全匹配比促销更好的转换, 这是比转换更好的转换。

    最后,我认为是 4.5 和 4.7 之间的区别使以下代码明确:

    #include <iostream>
    
    void foo(int i)            { std::cout << "foo(int)" << std::endl; }
    void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }
    
    int main()
    {
        foo(static_cast<short>(1));
    }
    
    • shortint 是晋升(因此具有晋升等级)
    • shortunsigned short 是一次转化(因此具有转化排名)

    最后,这段代码调用了foo(int),因为它是一个更好的候选者。

    【讨论】:

      【解决方案2】:

      升迁发生在算术和其他运算期间。当仅将一个整数类型存储在另一个整数类型中时,就会发生转换。

      【讨论】:

      • 嗯。因此,如果我有unsigned char a; signed char b; ... short c=a+b,则在开头ab提升 为(未)签名的整数,添加然后结果转换 为@ 987654324@?
      • @buratinas:a 被提升为无符号整数,b 被提升为有符号整数,然后将 b 提升的结果转换为无符号整数,然后将这些相加并将结果转换为有符号整数。
      • @Öö Tiib a 可能被提升为 int(例如,如果你说 short c=a-b,提升为 unsigned 会给出不正确的结果) - 除非 charint 是大小相同
      • 这里有一点,但是,算术操作可以导致转换和提升,以便将类型强制在一起。再举一个例子:unsigned int u = 2; int i = 2; u + i;i转换(未提升)为unsigned
      • @SteveJessop 是的,此转换基于 [expr] 中的通常的算术转换,而不是 [conv.integral] (OP 引用自:C++03,§4.7);它使用支持此答案的术语 source typedestination type 。因此,只有在将一种整数类型存储在另一种整数类型中时才会发生整数转换,这与通常的算术转换不要混淆。
      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2016-12-15
      • 1970-01-01
      • 2015-06-27
      • 2011-08-10
      • 2012-01-29
      相关资源
      最近更新 更多