当前位置: 首页 > 知识库问答 >
问题:

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

段坚
2023-03-14

在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个答案

梅飞宇
2023-03-14

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

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

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

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

毛勇
2023-03-14

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

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

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

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

 类似资料:
  • 每当我在我的计算机(Ubuntu 13.10,AMD64)上编译更少的css文件时,我得到的浮点结果与我的同事在他的计算机(Mac OSX 10.6)上编译的结果截然不同。这一切都很好。浮点数学等等。这些数字基本上是一样的。胡说八道。 但是,这使得区分和提交输出非常烦人。我最终发现了数百个可以忽略的问题: 我能做些什么来避免这个问题?

  • 有问题的代码如下: 编译器会优化它吗?根据C-Standard(如果我理解正确的话),第二个操作数必须提升为;因此乘法必须使用FPU(或fp仿真)完成。 从理论上讲,该操作可以在正常的硬件寄存器中完成,只需添加一个即时的(并且可能是溢出检查)。是否允许编译器执行此优化?是否有已知的编译器这样做?如果是这样,他们是否也会识别该表达式 这是避免有关隐式转换的静态代码检查器警告所必需的? 补充一下:我知

  • 主要内容:1) 源文件(Source File),2) 工程/项目(Project),3) 工程类型/项目类型,4) 链接(Link)上节我们介绍了编译器和 IDE 的概念,大家肯定希望赶紧实践一下,用 IDE 真正地运行一段C语言代码来看看效果,这样能够更快地获得成就感。 但是,使用 IDE 的过程中会涉及到一些与编程有关的概念,这些概念如果不提前了解,即使能够运行出程序来,也是雾里看花,知其然不知其所以然。本节的目标就是让大家对这些概念有一个简单的了解。 1) 源文件(Source File

  • 我正在尝试使用一个第三方API,在那里我可以获得对JDK 1.6之前的第三方API的支持。 我还有其他几个项目是使用JDK1.7构建的,作为产品的一部分,我还在打包JRE 1.7。 如果编译器符合性级别设置为JDK 1.6,则编译 当编译器符合性级别设置为JDK 1.6时,向第三方供应商申请支持是否安全。 更新:我假设在eclipse中设置编译器级别与设置源代码相同 我不确定是否使用JDK 1.7

  • 本文向大家介绍nginx编译安装后对nginx进行平滑升级的方法,包括了nginx编译安装后对nginx进行平滑升级的方法的使用技巧和注意事项,需要的朋友参考一下 nginx编译安装后用了一段时间后发现当前版本有漏洞或需要新的功能时就需要对当前nginx版本进行版本升级,但又不能影响正常的使用,所以这时就需到对nginx的平滑升级,更新到最新版本了。 本文演示的是nginx-1.13.6升级到ng

  • 当我从Eclipse构建到maven构建时,我发现了项目中的许多问题。我使用2.5.1编译器插件。 JDK是开放的-JDK-7 我在一个新项目中隔离了这个问题,并对其进行了深入研究。问题是: 这无法使用javaC进行编译(但在Eclipse中工作),并说明以下错误: [错误]无法执行目标组织。阿帕奇。专家插件:maven编译器插件:2.5.1:项目测试时编译(默认编译):编译失败 [错误]/hom