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

17 c++ floating-point performance casting

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

字节序是任何平台上的一个因素(即浮点数的字节顺序与整数不同)?

不同的宽度类型如何表现(例如,int to float与int to double)?

语言标准对这种演员表/转换的安全性有何保证?通过强制转换,我的意思是static_cast或C风格的演员.

反向浮点转换为int转换(或双转换为int)怎么样?如果浮点数保持小幅度值(例如,2),那么当解释为int时,位模式是否具有相同的含义?

Ste*_*sop 11

底层位是否被"重新解释"为浮点值?

不,该值根据标准中的规则进行转换.

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

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

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

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

字节序是任何平台上的一个因素(即浮点数的字节顺序与整数不同)?

没有永不.转换是根据值而非存储表示来定义的.

不同的宽度类型如何表现(例如,int to float与int to double)?

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

语言标准对这种演员表/转换的安全性有何保证?通过强制转换,我的意思是static_cast或C风格的演员.

如上所述,除了将浮点值转换为整数类型并且该值在目标类型的范围之外的情况之外,它是安全的.

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

不,不是的.IEEE的32位表示为2 0x40000000.


Gre*_*osz 7

作为参考,这是ISO-IEC 14882-2003所说的

4.9浮动积分转换

浮点类型的右值可以转换为整数类型的右值.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.[注意:如果目的地类型是`bool,请参阅4.12.]

可以将整数类型或枚举类型的右值转换为浮点类型的右值.如果可能,结果是准确的.否则,它是下一个较低或较高可表示值的实现定义选择.[注意:如果积分值不能完全表示为浮点类型的值,则会发生精度损失.]如果源类型为bool,则将值false转换为零,并将值true转换为1.

参考:每个计算机科学家应该知道的浮点运算

其他高价值的快速主题引用floatint转换:

好好读!