Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;当整数类型转换为浮点类型时,或者反之亦然?_C++_Performance_Casting_Floating Point - Fatal编程技术网

C++ C++;当整数类型转换为浮点类型时,或者反之亦然?

C++ C++;当整数类型转换为浮点类型时,或者反之亦然?,c++,performance,casting,floating-point,C++,Performance,Casting,Floating Point,底层位只是被“重新解释”为浮点值吗?或者是否存在运行时转换以生成最接近的浮点值 端点度是否是任何平台上的一个因素(即浮点数的端点度不同于整数) 不同宽度类型的行为如何(例如,int到float与int到double) 语言标准如何保证此类强制转换/转换的安全性?所谓演员阵容,我指的是静态演员阵容或C风格演员阵容 那么反浮点到整数的转换(或者双精度到整数)呢?如果浮点值的大小很小(例如2),那么位模式在解释为int时是否具有相同的含义?将整数转换为浮点时,除非处理非常大的整数,否则不会失去任何精度

底层位只是被“重新解释”为浮点值吗?或者是否存在运行时转换以生成最接近的浮点值

端点度是否是任何平台上的一个因素(即浮点数的端点度不同于整数)

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

语言标准如何保证此类强制转换/转换的安全性?所谓演员阵容,我指的是静态演员阵容或C风格演员阵容


那么反浮点到整数的转换(或者双精度到整数)呢?如果浮点值的大小很小(例如2),那么位模式在解释为int时是否具有相同的含义?

将整数转换为浮点时,除非处理非常大的整数,否则不会失去任何精度

将浮点转换为int时,实际上是在执行floor()操作。所以它只是在小数点后删除位

有关浮点读取的详细信息,请参阅:

IEEE单精度格式有24位尾数、8位指数和一个符号位。英特尔微处理器(如奔腾)中的内部浮点寄存器有64位尾数、15位指数和一个符号位。这使得执行中间计算的精度损失比许多其他实现要小得多。缺点是,根据中间值在寄存器中的保存方式,看起来相同的计算可能会给出不同的结果


因此,如果整数使用的位数超过24位(不包括隐藏的前导位),则在转换过程中很可能会失去一些精度。

ISO-IEC 14882-2003就是这样说的,仅供参考

4.9浮点积分转换

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

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

参考:

关于快速
float
int
转换的其他非常有价值的参考文献:

好好读一读

重新解释?术语“重新解释”通常指原始记忆的重新解释。当然,不可能有意义地将整数值重新解释为浮点值(反之亦然),因为它们的物理表示形式通常完全不同

转换类型时,将执行运行时转换(与重新解释相反)。转换通常不仅仅是概念上的,它需要实际的运行时工作,因为物理表示的不同。源值和目标值的位模式之间没有语言定义的关系。Endianness在其中也不起作用


将整数值转换为浮点类型时,如果可以用目标类型精确表示原始值,则会精确转换原始值。否则,转换过程将更改该值

当您将浮点值转换为整数类型时,小数部分将被简单地丢弃(即,不取最接近的值,而是将数字四舍五入到零)。如果结果不适合目标整数类型,则行为未定义


另外请注意,浮点到整数的转换(以及相反的转换)是标准转换,形式上不需要任何显式转换。人们有时可能使用显式强制转换来抑制编译器警告。

通常存在运行时转换,因为位表示通常不兼容(二进制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将有一个“随机”值,该值基于