底层位是否只是被“重新解释”为浮点值?或者是否有运行时转换来产生最接近的浮点值?
字节序是否在任何平台上都是一个因素(即 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/