C、FLT_MAX值大于32位?

C, FLT_MAX value larger than 32 bits?

我实际上正在研究如何显示浮点数(使用写入),但我遇到了一些让我感到困惑的事情。

我发现float是以32位存储的,其中1位为符号位,7位为指数位,其余为尾数位。

我的麻烦来了,当我用 printf 显示 FLT_MAX 时,我将通过简单的操作得到 340282346638528859811704183484516925440.000000 printf("%f\n", FLT_MAX)

这个值比INT_MAX大,比LLONG_MAX大,这个数字怎么能用32位存储呢?这真的是 32 位或系统依赖?我在 Ubuntu x86_64 GNU/Linux.

我无法理解如何在相同的位数中存储超过 10 个数字 (INT_MAX len)。

如果觉得是联动的问题,不过我也有麻烦双谁能给我

printf("%lf", DBL_MAX);
#179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

这让谜团变得更大了! 感谢您的帮助,希望我说清楚了。

比特只是具有两种状态的物质。他们没有内在的意义。当我们使用位来表示二进制整数时,我们将每个位解释为具有一个值,1 代表一位,2 代表另一位,4 代表另一位,8 代表另一位,依此类推。物理学、逻辑学或法律中没有任何东西需要我们给他们这样的解释。

当我们用位来表示一个浮点对象时,我们赋予了每一位不同的含义。一位代表符号。八位包含指数的编码。 23 位包含尾数的编码。

为了在给定浮点编码方案的情况下为正常范围内的数字弄清楚这些位的含义,我们将指数位解释为二进制数字,然后减去 127,然后乘以 2 的幂。 (例如,“10000011”是131的二进制数,所以它表示24)然后我们取有效位,将它们附加到“1.”上,形成这样的二进制数如“1.01011100000000000000000”。我们将该数字转换为数字(它是 159/128),然后将它乘以指数的幂(在本例中为 159/8)并应用符号。

由于指数可以很大,所以表示的值可以很大。将浮点数转换为字符输出如“340282346638528859811704183484516925440.000000”的软件为你做这些解读