如何将4字节存储如此大的3.4e38值

与32位一样,我们只能存储2 ^ 32位数据。 在C语言中,我们如何存储如此大的值3.4e38。 我无法理解它背后的机制。

在IEEE-754 32位二进制浮点格式中,32位用作:

  • 一位符号字段, s
  • 一个8位指数字段, e
  • 一个23位有效数(分数)字段, f

这些字段编码值:

  • 如果e中的所有位都打开而f不为零,则该值为NaN(非数字)。

  • 如果e中的所有位都打开且f为零,则如果s为0,则值为+∞(无穷大);如果s为1,则值为-∞。

  • 如果e为零,则值为(-1) s (0 + f •2 -23 )•2 -126

  • 否则,该值为(-1) s (1 + f •2 -23 )•2 e -127

一些关于此的说明:

  • (-1) s设置符号。 如果s为零,则该表达式为+1;如果s为1,则该表达式为-1。
  • 第三种情况包括零和所谓的次正规数。 在这种情况下,额外的零位前缀为分数字段。
  • 第四种情况是正常情况。 它包含大多数浮点值。 在这种情况下,额外的一位被加到分数字段的前面。

计算机硬件(或软件)以使算术运算的方式操纵这些位。 例如,当执行加法时,硬件(实际上)移位有效数的位以调整指数的差异,然后添加有效数,然后舍入以适合可用的位。 此外,如果加法使有效数字大于可用的位数,则向右移动(使其适合),并将指数增加1。