在C ++中,我们可以编写类似
的内容float f = 3.55;
这是一个合法的陈述,而实数数字的类型是双倍的,我们将这个双倍存储到浮点数。它本质上意味着将8个字节存储到4个字节(可能的数据丢失)?我的问题是,当我写作
long l = 333;
int y = l;
我收到错误,因为long值被转换为int值(可能的数据丢失)。但是为什么在浮点(4字节)中存储8字节双实数时遇到问题?
答案 0 :(得分:2)
来自§4标准转换[conv] C ++ 11:
标准转化是具有内置含义的隐式转化。 第4条列举了全套此类转换。一个标准 转换序列是一系列标准转换 以下顺序:
...
来自以下设置的零次或一次转化:整体促销, 浮点促销,积分转换,浮点数 转化,浮点积分转换,指针转换, 指向成员转换的指针和布尔转换。
因此,隐含地允许两种数字类型之间的转换,因为如果仔细使用它也是有意义的。例如,当您从P(int
),R(int
)和T(float
)计算金额(int
)时;
来自§4.8浮点转换[conv.double],
- 浮点类型的prvalue可以转换为prvalue 另一种浮点类型。如果源值可以准确 在目标类型中表示,转换的结果是 确切的表示。如果源值在两个相邻之间 目的地值,转换的结果是 实现定义的这两个值的选择。除此以外, 行为未定义。
- 转换允许作为浮点数 促销活动将从浮点转化集中排除。
合并double
编译器隐式执行float
到C++
转换。 (以牺牲精度为代价)
答案 1 :(得分:0)
您的示例不是错误,应该编译。
当您将较大的整数类型分配给较小的整数类型(或执行任何不具有作为促销的质量的转换)时,会发生积分转换,并且精度可能会丢失。
类似地,当您将一个浮点类型分配给另一个浮点类型时,会发生浮点转换;结果是相同的值或接近它的值,除非源值超出目标类型的范围。