C++ C++;当整数类型转换为浮点类型时,或者反之亦然?
底层位只是被“重新解释”为浮点值吗?或者是否存在运行时转换以生成最接近的浮点值 端点度是否是任何平台上的一个因素(即浮点数的端点度不同于整数) 不同宽度类型的行为如何(例如,int到float与int到double) 语言标准如何保证此类强制转换/转换的安全性?所谓演员阵容,我指的是静态演员阵容或C风格演员阵容C++ C++;当整数类型转换为浮点类型时,或者反之亦然?,c++,performance,casting,floating-point,C++,Performance,Casting,Floating Point,底层位只是被“重新解释”为浮点值吗?或者是否存在运行时转换以生成最接近的浮点值 端点度是否是任何平台上的一个因素(即浮点数的端点度不同于整数) 不同宽度类型的行为如何(例如,int到float与int到double) 语言标准如何保证此类强制转换/转换的安全性?所谓演员阵容,我指的是静态演员阵容或C风格演员阵容 那么反浮点到整数的转换(或者双精度到整数)呢?如果浮点值的大小很小(例如2),那么位模式在解释为int时是否具有相同的含义?将整数转换为浮点时,除非处理非常大的整数,否则不会失去任何精度
那么反浮点到整数的转换(或者双精度到整数)呢?如果浮点值的大小很小(例如2),那么位模式在解释为int时是否具有相同的含义?将整数转换为浮点时,除非处理非常大的整数,否则不会失去任何精度 将浮点转换为int时,实际上是在执行floor()操作。所以它只是在小数点后删除位 有关浮点读取的详细信息,请参阅: IEEE单精度格式有24位尾数、8位指数和一个符号位。英特尔微处理器(如奔腾)中的内部浮点寄存器有64位尾数、15位指数和一个符号位。这使得执行中间计算的精度损失比许多其他实现要小得多。缺点是,根据中间值在寄存器中的保存方式,看起来相同的计算可能会给出不同的结果
因此,如果整数使用的位数超过24位(不包括隐藏的前导位),则在转换过程中很可能会失去一些精度。ISO-IEC 14882-2003就是这样说的,仅供参考 4.9浮点积分转换 浮点类型的右值可以转换为整数类型的右值。转换截断;也就是说,小数部分被丢弃。如果目标类型中无法表示截断的值,则行为未定义。[注:如果目的地类型为'bool',请参见4.12。] 整数类型或枚举类型的右值可以转换为浮点类型的右值。如果可能的话,结果是准确的。否则,它是由实现定义的下一个较低或较高可表示值的选择。[注意:如果整数值不能准确表示为浮动类型的值,则会发生精度损失。]如果源类型为
bool
,则值false
转换为零,值true
转换为一
参考:
关于快速float
到int
转换的其他非常有价值的参考文献:
将整数值转换为浮点类型时,如果可以用目标类型精确表示原始值,则会精确转换原始值。否则,转换过程将更改该值 当您将浮点值转换为整数类型时,小数部分将被简单地丢弃(即,不取最接近的值,而是将数字四舍五入到零)。如果结果不适合目标整数类型,则行为未定义
另外请注意,浮点到整数的转换(以及相反的转换)是标准转换,形式上不需要任何显式转换。人们有时可能使用显式强制转换来抑制编译器警告。通常存在运行时转换,因为位表示通常不兼容(二进制0通常同时为0和0.0除外)。C和C++标准只处理价值,而不是表示,并指定一般合理的行为。请记住,大的
int
值通常不能用float
表示,大的float
值不能用int
表示
因此:
所有转换都是按值进行的,而不是按位模式。不要担心位模式
也不要担心endianness,因为这是一个按位表示的问题
如果整数值的绝对值较大,将int
转换为float
可能会失去精度;使用double
的可能性较小,因为double
更精确,可以表示更多更精确的数字。(详细信息取决于系统实际使用的表示形式。)
语言定义没有提到位模式
从
float
转换为int
也是一个值问题,而不是位模式问题。精确浮点2.0将转换为整数2,因为这是实现的设置方式,而不是位模式。如果您强制转换值本身,它将被转换(因此在浮点->整数转换中,3.14变为3)
但是如果您强制转换指针,那么您实际上将“重新解释”底层位。所以,如果你这样做:
double d = 3.14;
int x = *reinterpret_cast<int *>(&d);
double d=3.14;
int x=*重新解释铸件(&d);
x将有一个“随机”值,该值基于