浮点升级:stroustrup vs编译器 - 谁是对的?

时间:2013-06-20 13:53:53

标签: c++ c++11

在Stroustrup的新书“The C ++ Programming Language - Fourth Edition”的第10.5.1节中,他说,在执行算术运算之前,使用整数提升来创建较短整数类型的整数,同样地,浮动 - 点推广用于从浮点数中创建双打。

我使用以下代码确认了第一个索赔:

#include <iostream>
#include <typeinfo>

int main()
{
    short a;
    short b;
    std::cout << typeid(a + b).name() << std::endl;
}

使用vc ++输出“int”,使用gcc输出“i”。

但是用浮点数而不是短路来测试它,输出仍然是“浮动”或“f”:

#include <iostream>
#include <typeinfo>

int main()
{
    float a;
    float b;
    std::cout << typeid(a + b).name() << std::endl;
}

根据Stroustrup的说法,浮点促销规则没有例外,所以我期望输出“double”或“d”。

关于促销活动的上述部分是错误的还是某种程度上不清楚?关于类型促销,C ++ 98和C ++ 11有什么不同吗?

2 个答案:

答案 0 :(得分:29)

我不知道Stroustrup的书到底是什么,但根据标准,float在这种情况下不会转换为double。在应用大多数算术二元运算符之前,应用5p9中描述的通常的算术转换

  
      
  • 如果任一操作数是作用域枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式不正确。
  •   
  • 如果任一操作数的类型为long double,则另一个操作数应转换为long double。
  •   
  • 否则,如果任一操作数为double,则另一个操作数应转换为double。
  •   
  • 否则,如果任一操作数为float,则另一操作数应转换为float。
  •   
  • 否则,应对两个操作数执行整体促销(4.5)。 [...]
  •   

整体促销是导致两个short转换为int的原因。但是根据这些规则,两个float将不会转换为double。如果您向float添加double,则float将转换为double

以上内容来自C ++ 11。 C ++ 03包含相同的规则,但引用范围枚举的规则除外。

答案 1 :(得分:6)

与此同时,Stroustrup似乎认识到推荐句不正确或至少具有误导性。他从第10.5.1节删除了关于浮点促销的判决。

请参阅Stroustrup网页上第4版第3版的errata

  

267:s /同样,浮点数促销用于创建浮点数的双打//

(注:表达式s / regexp / replacement /类似于 sed unix工具语义。它搜索模式 regexp 并用替换替换它。在我们的案例中没有。)