首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点推广: stroustrup vs编译器-谁是对的?

浮点推广: stroustrup vs编译器-谁是对的?
EN

Stack Overflow用户
提问于 2013-06-20 21:53:53
回答 2查看 1.5K关注 0票数 34

在Stroustrup的新书"The C++ Programming Language - Fourth Edition“的第10.5.1节中,他说,在执行算术运算之前,整数提升用于从较短的整数类型创建整数,类似地,浮点提升用于从浮点数创建双精度。

我用以下代码确认了第一个声明:

代码语言:javascript
复制
#include <iostream>
#include <typeinfo>

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

这对vc++输出"int“,对gcc输出"i”。

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

代码语言:javascript
复制
#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有什么区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 22:02:32

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

  • 如果其中一个操作数属于限定了作用域的枚举类型(7.2),则不执行任何转换;如果另一个操作数不具有相同的类型,则表达式的格式不正确。如果一个操作数是long double类型,则另一个操作数应转换为long double.
  • Otherwise,。如果其中一个操作数为
  • ,则另一个操作数应转换为long。如果其中一个操作数是浮点型,则另一个操作数应转换为整数。...

积分提升会导致两个short%s转换为int%s。但根据这些规则,两个float%s将不会转换为double%s。如果您将float添加到double,则该float将转换为double

以上代码来自C++11。C++03包含相同的规则,除了引用范围枚举的规则。

票数 29
EN

Stack Overflow用户

发布于 2014-09-21 02:57:38

与此同时,Stroustrup似乎认识到refer语句是不正确的,或者至少是误导性的。他从第10.5.1节中删除了关于浮点升级的句子。

请在Stroustrup的网页上查看第四版第三次印刷的errata

pg 267: s/同样,浮点提升用于在浮点数之外创建双精度浮点数//

(备注:表达式s/regexp/替换/类似于sed unix工具语义。它搜索模式regexp并将其替换为替换。在我们的案例中没有任何东西。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17215484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档