提问者:小点点

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


在Stroustrup的新书《C编程语言-第四版》第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个答案

匿名用户

我不知道Stroustrup的书到底说了什么,但根据标准,在这种情况下,floats不会转换为双精度。在应用大多数算术二进制运算符之前,应用5p9中描述的常见算术转换:

  • 如果任一操作数属于作用域枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式的格式不正确

积分提升是导致两个短的s转换为int的原因。但是根据这些规则,两个浮的s不会转换为双的。如果将浮点值添加到双精度浮点值,则浮点值将转换为双精度浮点值。

以上来自C 11。C 03包含相同的规则,但涉及作用域枚举的规则除外。

匿名用户

与此同时,Stroustrup似乎意识到引用句是不正确的,或者至少是误导性的。他已经从第10.5.1节中删除了关于浮点提升的句子。

请在Stroustrup的网页上查看第4版第3次印刷的勘误表:

PG 267: s/同样,浮点提升用于从浮点数中创建双打//

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