这个int到浮点转换是怎么回事,为什么它是真空的呢?

PER*_*Zje 1 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);
}
Run Code Online (Sandbox Code Playgroud)

这给出了这个输出:

>     2147483647                                                                             
>     2147483648.000000                                                                      
>     16777215                                                                               
>     16777215.000000
Run Code Online (Sandbox Code Playgroud)

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

Max*_*Max 10

不幸的是,你错了.

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

如果您的平台兼容IEEE-754,并且您的浮点数是单精度的,那么它特别分解如下:

  • 1位 - 签名
  • 8位 - 指数
  • 24位1 - 有效数

这意味着可以精确地表示高达24位的所有整数,之后,某些数字必须丢失一些精度.

使用相同的假设,double将保持所有32位整数,因为double具有53位精度.

参考文献:

1:仅存储23位,但对于常规数字,最高位始终被视为1.这意味着如果最高位需要为零,则整个事物向左移动,指数减小.这使我们获得了额外的精度,不需要存储.