为什么可以使用从double到float的隐式强制转换

Why Implicit Cast from double to float available?

本文关键字:转换 float 可以使 double 为什么      更新时间:2023-10-16

在C++中,我们可以编写类似的东西

float f = 3.55;

这是一个法律声明,而实数数字的类型是double,我们将这个double存储到浮点数中。它本质上意味着将8个字节存储到4个字节中(可能会丢失数据)?我的问题是,当我写时

long l = 333; 
int y = l;

我得到一个错误,因为long值被转换为int值(可能会丢失数据)。但是为什么我在浮点(4字节)中存储8字节的双实数时不会遇到问题?

从§4标准转换[conv]C++11:

标准转换是具有内在意义的隐含转换。第4条列举了这类转换的全部内容。一个标准转换序列是以下顺序:

从以下集合转换为零或一:积分促销,浮点提升、积分转换、浮点转换,浮点积分转换,指针转换,指针到成员转换和布尔转换。

因此,两种数字类型之间的转换是允许隐式的,因为如果小心使用,这也是有意义的。例如,当您根据P(int)、R(float)和T(int)计算Amount(int)时;

根据§4.8浮点转换[conv.double],

  • 浮点类型的prvalue可以转换为另一种浮点类型。如果源值可以精确以目标类型表示,转换的结果为确切的表述。如果源值介于两个相邻值之间目标值,转换的结果是实现定义了对这些值中任一值的选择。否则行为是未定义的
  • 允许作为浮点的转换促销被排除在浮点转换的集合之外

似乎doublefloat的转换是由兼容的C++编译器隐式执行的。(以可能失去精度为代价)

您的示例不是错误,应该编译。

当您将较大的整数类型分配给较小的整数类型(或执行任何不具有提升质量的转换)时,会发生积分转换,精度可能会丢失。

类似地,当您将一种浮点类型分配给另一个浮点类型时,会发生浮点转换;结果要么是相同的值,要么是接近该值的值,除非源值超出了目标类型的范围。