为什么可以使用从double到float的隐式强制转换
Why Implicit Cast from double to float available?
在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可以转换为另一种浮点类型。如果源值可以精确以目标类型表示,转换的结果为确切的表述。如果源值介于两个相邻值之间目标值,转换的结果是实现定义了对这些值中任一值的选择。否则行为是未定义的
- 允许作为浮点的转换促销被排除在浮点转换的集合之外
似乎double
到float
的转换是由兼容的C++
编译器隐式执行的。(以可能失去精度为代价)
您的示例不是错误,应该编译。
当您将较大的整数类型分配给较小的整数类型(或执行任何不具有提升质量的转换)时,会发生积分转换,精度可能会丢失。
类似地,当您将一种浮点类型分配给另一个浮点类型时,会发生浮点转换;结果要么是相同的值,要么是接近该值的值,除非源值超出了目标类型的范围。
相关文章:
- 没有从阵列<float>到阵列<int>的可行转换
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 如何将 qml 的文本转换为 float 和 int
- 错误:无法将"float*"转换为"float"
- 缩小从double到float的转换
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 如何有效地将一个大std::字符串的一部分转换为float
- 如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
- C++优化从 int 到 float 的数组转换
- OpenCL 将 float16 转换为 float*
- 在 C++ 中从 'const float*' 到 'float*' 的转换无效
- 如何修复"无法在初始化时将'Tmp'转换为'float'
- 如何将 std::array<double, 100> 转换为 std::array<float, 100> ?(避免明显的样板实现)
- 如何将可变字符串[]转换为float
- 警告:从 'char *' 到 'float *' 的强制转换将所需的对齐从 1 增加到 4 [-Wcast-align]
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- MBED RTOS将Float转换为字符串/字符阵列
- 不知道参数 1 从 sf::Vector2i 到 const sf::Vector2i& 的转换<float>
- 显式类型转换 float(intvar) 结果为 int