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

kib*_*iba 33 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;
}
Run Code Online (Sandbox Code Playgroud)

这用vc ++输出"int",用gcc输出"i".

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

#include <iostream>
#include <typeinfo>

int main()
{
    float a;
    float b;
    std::cout << typeid(a + b).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

根据Stroustrup,浮点提升规则没有例外,所以我期望输出"double"或"d".

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

int*_*jay 29

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

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

积分促销是导致两个shorts转换为ints的原因.但是根据这些规则,两个floats不会被转换为doubles.如果添加floatdouble时,float将被转换为一个double.

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


tho*_*s6g 6

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

请参阅Stroustrup网页上第4版第3版的勘误表:

pg 267:s /同样,浮点数提升用于创建浮点数的双打//

(注:表达式S /正则表达式/更换/类似于sed的 UNIX工具,它的语义搜索的模式.正则表达式,并替换它替代我们的情况没有什么.)