为什么隐式转换从double到float可用?

时间:2015-03-04 05:50:42

标签: c++ double turbo-c++

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

的内容
float f = 3.55;

这是一个合法的陈述,而实数数字的类型是双倍的,我们将这个双倍存储到浮点数。它本质上意味着将8个字节存储到4个字节(可能的数据丢失)?我的问题是,当我写作

long l = 333; 
int y = l;

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

2 个答案:

答案 0 :(得分:2)

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

  

标准转化是具有内置含义的隐式转化。   第4条列举了全套此类转换。一个标准   转换序列是一系列标准转换   以下顺序:

     

...

     

来自以下设置的零次或一次转化:整体促销,   浮点促销,积分转换,浮点数   转化,浮点积分转换,指针转换,   指向成员转换的指​​针和布尔转换。

因此,隐含地允许两种数字类型之间的转换,因为如果仔细使用它也是有意义的。例如,当您从P(int),R(int)和T(float)计算金额(int)时;

来自§4.8浮点转换[conv.double],

  
      
  • 浮点类型的prvalue可以转换为prvalue   另一种浮点类型。如果源值可以准确   在目标类型中表示,转换的结果是   确切的表示。如果源值在两个相邻之间   目的地值,转换的结果是   实现定义的这两个值的选择。除此以外,   行为未定义。
  •   
  • 转换允许作为浮点数   促销活动将从浮点转化集中排除。
  •   

合并double编译器隐式执行floatC++转换。 (以牺牲精度为代价)

答案 1 :(得分:0)

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

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

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