Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浮点提升:stroustrup vs compiler-谁是对的? 在Stroustrup的新书《C++编程语言——第四版》的第十节5.1中,他说,在执行算术运算之前,使用积分提升来创建较短整数类型的int型,同样,浮点提升用于从浮动中创建双倍。_C++_C++11 - Fatal编程技术网

浮点提升:stroustrup vs compiler-谁是对的? 在Stroustrup的新书《C++编程语言——第四版》的第十节5.1中,他说,在执行算术运算之前,使用积分提升来创建较短整数类型的int型,同样,浮点提升用于从浮动中创建双倍。

浮点提升:stroustrup vs compiler-谁是对的? 在Stroustrup的新书《C++编程语言——第四版》的第十节5.1中,他说,在执行算术运算之前,使用积分提升来创建较短整数类型的int型,同样,浮点提升用于从浮动中创建双倍。,c++,c++11,C++,C++11,我用以下代码确认了第一个索赔: #include <iostream> #include <typeinfo> int main() { short a; short b; std::cout << typeid(a + b).name() << std::endl; } #包括 #包括 int main() { 短a; 短b; std::cout我不知道Stroustrup的书到底说了什么,但根据标准,floats在这

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

#include <iostream>
#include <typeinfo>

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

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

  • 如果任一操作数为作用域枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式的格式不正确
  • 如果任一操作数为长双精度类型,则另一个操作数应转换为长双精度
  • 否则,如果任一操作数为双精度,则另一个操作数应转换为双精度
  • 否则,如果任一操作数为浮点,则另一个操作数应转换为浮点
  • 否则,应在两个操作数上执行积分提升(4.5)。[…]
积分提升是导致两个
short
s转换为
int
s的原因。但根据这些规则,两个
float
s不会转换为
double
s。如果将
float
添加到
double
,则
float
将转换为
double


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

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

请参见Stroustrup网页上第四版的第三次印刷:

第267页:s/类似地,浮点提升用于从浮点创建双精度//


(备注:表达式s/regexp/replacement/类似于sed unix工具语义。它搜索模式regexp并将其替换为replacement。本例中没有任何内容。)

我相信从
float
提升到
double
只会在混合算术伦理的情况下发生;也就是说,当将
float
double
相加时,
float
首先提升,然后再进行相加。你确定不是这样吗?
int
是“最低级别”C++中的积分运算,<代码>浮点< /代码>是“最小值”对于浮点运算。请注意以下问题:不要发布达到预期效果的代码,然后解释其他代码无法达到预期效果。发布无法达到预期效果的代码。该规则以前与Stroustrup所述的规则相同。它在一段时间前发生了更改,但书中相应的文本没有更新。
 第267页:s/类似地,浮点提升用于在浮点的基础上创建双精度//
(对于那些不熟悉该语法的人,这意味着应该删除该句子)这似乎符合OP的经验。我认为标准是正确的。可能是书中的一个打字错误?+1。
4.6浮点提升[conv.fpprom]1 float类型的prvalue可以转换为double类型的prvalue。该值不变。2此转换称为浮点提升。
-是另一种转换吗?因此没有默认的浮点类型提升?Stroustrup说提升的目的是将操作数转换为“自然”值算术运算的大小。“自然”浮点类型是双精度的,所以它看起来像是书中的一个错误。@fiscblog:这只是定义了什么是“浮点提升”是。它没有说明何时执行。当添加两个浮点时,不执行浮点提升。执行浮点提升的情况在标准的其他地方有描述。@kiba:我不能在不看清楚书中所说内容的情况下判断这本书。正如fiscblog所说,有一件事叫做“浮点提升”这将浮点数转换为双精度。但它不是为算术运算执行的。这应该是一个注释而不是答案。@EWit:Tom8128还没有赢得这个分数。@Tom8128:I+1 you,因为您的答案是正确的,我在问题下的讨论中添加了一个注释以提及勘误表。但是,我建议您将您的问题修改为I包括一个到勘误表的链接和相关的引用,以及一个小的解释。事实上,答案很短,需要一些扩展才能变得很好。将来,当你获得评论特权时,类似的事情应该是评论。这就是为什么我建议你扩展这个答案:把它变成一个正确的答案。
#include <iostream>
#include <typeinfo>

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