所以我基本上已经有了这段代码
#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中的任何浮点数表示。为什么会这样?
答案 0 :(得分:10)
不幸的是,你想错了。
在具有32位整数和32位浮点数的典型实现中,很明显浮点数不能完全包含所有整数,因为它的某些位必须用于指数,以使其成为浮点。
如果您的平台兼容IEEE-754,并且您的浮点数是单精度的,则它会像这样分解:
这意味着可以精确表示所有不超过24位的整数,此后,某些数字必然会失去一定的精度。
在相同的假设下,双精度将保留所有32位整数,因为双精度具有53位精度。
参考文献:
1 :仅存储23位,但对于常规数字,最高位始终被视为1。这意味着如果最高位需要为零,则将整个对象向左移,并且指数减小。这使我们无需存储任何额外的精度。