C语言浮点数在内存中的存储

目录

  • 浮点数在内存中的存储规则
  • 浮点数与整数在内存中的对比
  • 浮点数从内存中取出

浮点数在内存中的存储规则

字面值浮点数有两种写法
C语言浮点数在内存中的存储_第1张图片

一种直接写完整浮点数,另一种使用科学计数法,书写一个字面值浮点数,不管如何声明,浮点数在内存中存储的规则都是一样的,下面我来详细讲解浮点数在内存中的存储规则。
浮点数在内存中的存储是遵循IEEE754规则,类似于二进制的科学计数法,及一个浮点数一定可以被写成(-1)^S * M * 2^E, 其中 (-1)^ S代表一个浮点数的符号位,M代表数位,2^E代表调整位,如图。
C语言浮点数在内存中的存储_第2张图片
这里可能有一个问题,就是为什么数位要存储的不是M,而是M-1?
答案是提升精度,对于一个二进制小数而言,将其化为IEEE754标准后,1<=M<2,既然如此,不如不存入M的最高位,将其舍弃,以存放后面的小数位,提高精度,在取出使用的时候,在加1就好了,那么我们来看看代码
C语言浮点数在内存中的存储_第3张图片
在代码中,S=0,M=011并没有存入最高位,但是E明明等于2啊,为什么存入的是129呢?因为E所占比特位代表一个无符号数,可是如果f=0.5的话,那么E=-1,无符号数无法表示负数,所以,索性在存入的时候,直接在E的基础上加127/1023(双精度浮点型),来存入内存中,所以在上述引例中,存入的结果是129。

浮点数与整数在内存中的对比

我们了解了浮点数的存储,同时也了解了整数的存储,我们现在来对比一下它们,首先,浮点数没有所谓的有符号或无符号,浮点数都是有符号的,齐次,对于整数而言,存入内存的是整数的补码,而浮点数存入的是IEEE754规则中的一些数字,这时有人疑惑,如果一个浮点数通过整形打印,或一个整数通过浮点数打印会怎么样呢,答案是打印出的结果会超出你的预料,所以什么类型的数据就用什么类型打印,以免发生出乎意料的结果。

浮点数从内存中取出

我们按照存入的E的大小进行分类,可以分为3种
1.存入的E位全1:如果是这样就说明你存入的数字太大/太小了,要么接近正无穷/负无穷。
2.存入的E位有0有1:这是最正常的情况,在取出时,我们只需要将M位+1,E位减去127/1023,同时带上符号,就完成了。
3.存入的E位全0:这说明你存入的数据是一个趋近于0的数,在取出的时候,M位不再+1,因为趋近于0,加不加以及无所谓了。

你可能感兴趣的:(c语言,经验分享)