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

目录

一、相关介绍

二、如何存储

(一)步骤一:

(二)步骤二: 

(三)步骤三:

三、举例:

 四、取出时的相关规则:


一、相关介绍

1.在浮点型中:1E10表示1.0*(10^10)

2.整形家族的取值范围可在头文件<limits.h>中查看,浮点型的取值范围可在头文件<float.h>中查看。

3.存储的时候需要用到小数的二进制,所以我们先了解一下小数的二进制。

二、如何存储

(一)步骤一:

1.国际标准IEEE754规定。任意一个二进制浮点数V可以表示成:(-1)^S * M * 2^E.

解释:

①:-1^(S)表示符号位。当S==0,(-1)^S==-1,此时表示负数;当S==1,(-1)^S==1,此时表示正数。

②:M表示有效数字。且1<=M<2.

③:2^E表示指数位。

这样看可能很抽象,我们举个例子,如下图:

(二)步骤二: 

2.接着IEEE754又规定:

①:对于32位的浮点数,最高位的1位存S的值,接着八位存E的值,剩下的23位存有效数字M。

 ②:对于64位的浮点数,最高位的一位存符号位S,接着11位存指数E,剩下52位存有效数字M。

(三)步骤三:

3.接下来在介绍一些特殊规定 

①:对于有效数字M因为用了科学计数法,所以总能写成1.xxxxx...,所以在存储的时候,第一位的1可以被舍去,只保存后.xxxxx..的小数部分,等到读取的时候,再把1给加上去。

目的:这样做可以节省一位有效数字,以32位的浮点数为例,留给M只有23,将1舍去后,等于保存24位有效数字。

②:对于指数E,首先E是一个无符号整数,如果E是八位,他的取值在0到255;如果E是11位,他的取值范围为0到2047;但科学计数法中E可能为负数,所以IEEE754规定,在存储E时要将真实值加上一个中间数以确保E为正数或0,中间数规则如下:

对于8位的E,中间数是127

对于11位的E,中间数是1023

三、举例:

知道上述规则后,就可以存储一个浮点数了,接下来我们以32位下存储5.5为例

 四、取出时的相关规则:

对于取出时,E分为三种情况:

1.E不全为0也不全为1(普通情况):计算值减去123(1023)就可得到E的真实值

2.E全为0:这时IEEE754规定E==1-127(1-1023),且M不再加上第一位的1,而是还原为0.xxxx...的小数。这样做的目的是为了表示正负0,以及接近0的数字

3.E全为1时:这时,有效数字M全为0,此时表示该数为正负无穷大。

本次知识到此结束,希望对你有所帮助。

猜你喜欢

转载自blog.csdn.net/hffh123/article/details/132229285
今日推荐