这个int到float转换到底是怎么回事,为什么它不正确?

时间:2018-09-11 20:35:02

标签: c

所以我基本上已经有了这段代码

#include <stdio.h>

int main()
{
    int n = 0x7fffffff;
    float f = n;

    printf("%d\n", n);
    printf("%f\n", f);

    n = 0x00ffffff;
    f = n;

    printf("%d\n", n);
    printf("%f", f);
}

这给出了这个输出:

>     2147483647                                                                             
>     2147483648.000000                                                                      
>     16777215                                                                               
>     16777215.000000

为什么两个第一个数字之差,而不是第二个两个数字之差。我认为任何整数都可以由c中的任何浮点数表示。为什么会这样?

1 个答案:

答案 0 :(得分:10)

不幸的是,你想错了。

在具有32位整数和32位浮点数的典型实现中,很明显浮点数不能完全包含所有整数,因为它的某些位必须用于指数,以使其成为浮点。

如果您的平台兼容IEEE-754,并且您的浮点数是单精度的,则它会像这样分解:

  • 1位-符号
  • 8位-指数
  • 24位 1 -有意义

这意味着可以精确表示所有不超过24位的整数,此后,某些数字必然会失去一定的精度。

在相同的假设下,双精度将保留所有32位整数,因为双精度具有53位精度。

参考文献:

1 :仅存储23位,但对于常规数字,最高位始终被视为1。这意味着如果最高位需要为零,则将整个对象向左移,并且指数减小。这使我们无需存储任何额外的精度。