所以我基本上得到了这个代码
#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,并且您的浮点数是单精度的,那么它特别分解如下:
这意味着可以精确地表示高达24位的所有整数,之后,某些数字必须丢失一些精度.
使用相同的假设,double将保持所有32位整数,因为double具有53位精度.
参考文献:
1:仅存储23位,但对于常规数字,最高位始终被视为1.这意味着如果最高位需要为零,则整个事物向左移动,指数减小.这使我们获得了额外的精度,不需要存储.