c++ - 当整数类型转换为浮点类型时,C++ 中会发生什么,反之亦然?

标签 c++ performance casting floating-point

底层位是否只是被“重新解释”为浮点值?或者是否有运行时转换来产生最接近的浮点值?

字节序是否在任何平台上都是一个因素(即 float 的字节序不同于整数)?

不同宽度类型的行为如何(例如,int 到 float 与 int 到 double)?

语言标准对此类强制转换/转换的安全性有何保证?所谓类型转换,是指 static_cast 或 C 风格的类型转换。

float 到 int 的逆转换(或 double 到 int)呢?如果一个 float 持有一个小幅度值(例如,2),当解释为 int 时,位模式是否具有相同的含义?

最佳答案

底层位是否只是被“重新解释”为浮点值?

不,值是按照标准中的规则转换的。

是否有运行时转换来产生最接近的浮点值?

是的,有一个运行时转换。

对于浮点 -> 整数,如果源值在整数类型的范围内,该值将被截断。如果不是,则行为未定义。至少我认为重要的是源值(value),而不是结果。我必须查一下才能确定。如果目标类型是 char,那么边界情况就是 CHAR_MAX + 0.5。我认为将其转换为 char 是未定义的,但正如我所说的,我不确定。

对于整数 -> 浮点,如果可能,结果是完全相同的值,否则是整数值两侧的两个浮点值之一。不一定是两者中的较近者。

字节序是否在任何平台上都是一个因素(即 float 的字节序不同于整数)?

不,从来没有。转换是根据值定义的,而不是存储表示。

不同宽度类型的行为如何(例如,int 到 float 与 int 到 double)?

重要的是类型的范围和精度。假设 32 位整数和 IEEE 32 位 float ,则 int->float 转换可能不精确。假设也是 64 位 IEEE double ,int->double 转换不可能是不精确的,因为所有 int 值都可以精确地表示为 double 。

语言标准如何保证此类转换/转换的安全性?我所说的类型转换是指 static_cast 或 C 风格的类型转换。

如上所述,它是安全的,除非将浮点值转换为整数类型,并且该值超出目标类型的范围。

如果 float 保持一个小幅度值(例如,2),当解释为 int 时,位模式是否具有相同的含义?

不,它没有。 2 的 IEEE 32 位表示是 0x40000000

关于c++ - 当整数类型转换为浮点类型时,C++ 中会发生什么,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2044124/

相关文章:

java - 在 Java/C++ 中创建类单例

c++ - MFC 中 AddString 的性能缓慢

node.js - Node - 设置每个异步回调的最大时间

c++ - 将特征矩阵转换为 unsigned char *

c++ - 我不明白 std::shared_ptr 的 -> 运算符

c++ - 从 vector 到指针 vector 的最短转换

c++ - 组合可编辑 C++

javascript - 如何优化以下设置元素 CSS 属性的 JavaScript

java - 如果应该避免向下转型,我应该怎么做?

java - 对于未知类型转换列表的语句