数据在内存中的存储(2)

目录

浮点型在内存中的存储

一、浮点型数字的二进制

二、浮点型在内存中的存储形式

1、浮点型的二进制规范写法:

1.1、普通写法:

 1.2、科学计数法:

1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

2、浮点型在内存中的存储方式:

关于S:

关于M:

 关于E:

转化案例: 

3、关于取出浮点数再内存中的数据

3.1、E不全为0或不全为1

3.2、E全为0

3.3、E全为1



数据在内存中的存储(2)_第1张图片

浮点型在内存中的存储

一、浮点型数字的二进制

浮点型数字的二进制形式转化为十进制其实也是和整数型数字转化为二进制一样,通过权重进行运算。


权重详情:http://t.csdn.cn/dw8tX

  • 但不同的是浮点型数字的小数部分。

例如,数字5.5

它的整数部分是5,转化为二进制是101,而小数部分是0.5,拿0.5这么转化为二进制呢? 

其实,小数部分也和权重有关,如下图所示:

数据在内存中的存储(2)_第2张图片

小数点的右边一位的权是2的-1次方,所以权重是2的-1次方乘1,也就是得到数字0.5

而小数点的右边的第二位的权是2的-2次方,所以权重是2的-2次方乘1,得到数字0.25

所以进制的小数部分是0.5+0.25=0.75

数据在内存中的存储(2)_第3张图片 

二、浮点型在内存中的存储形式

1、浮点型的二进制规范写法:

1.1、普通写法:

如上文所诉,我们可以得知了5.5的二进制运算法则,那么5.5这个浮点型数字的二进制这么表达呢?

其实上文也有展示,这其实就和普通浮点型的表达形式一样,用小数点将整数部分的二进制和小数部分的二进制分开。

例如:V = 5.5  它的二进制表达数为,101.1 其中小数点将整数和小数部分隔开,也因此,我们也可以直到那个是小数部分的权,那个是整数部分的权。

 1.2、科学计数法:

对于浮点数而言,科学计数法是一个十分方便的写法。

例如:123.45可以写为1.2345*10^2 将小数点朝前移动两位,并乘上10的2次方,使得整数只剩下一位。

  • 而在浮点数的二进制形式中也可以这样写。
  • 例如:V = 5.5 它的二进制写法是101.1 那么使用科学计数法则是 1.011*2^2  和十进制一样,将小数点往前移动两位,但因为是二进制,由于满二进1的原则,所以这里乘的是2的二次方,这和10的2次方是一个道理。

1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

 数据在内存中的存储(2)_第4张图片

其实,这就是科学计数法的一种升级版。

在科学计数法的基础上增加了一个符号位,也就是(-1)^ s 

 (-1)^ s 表示的是一个正负号,当s为0时表达是正数,当s为1时表达的是负数。

例如:

  • V = 5.5
  • 因为5.5是一个正数,所以s为0
  • 所以写法如下:(-1)^ 0 * 1.011 * 2 ^ 2
  • 其中 0 = s       1.11 = M        2^2中的第二个2 表示E  

又例如:

 数据在内存中的存储(2)_第5张图片

2、浮点型在内存中的存储方式:

在IEEE754的规范标准下,浮点型在内存中其实只要存储,S、E、M等即可。

数据在内存中的存储(2)_第6张图片 

关于S:

因为S只是表达正负,所以S存储的是0或1,0表达正数,1表达负数

关于M:

为了将M的存储更为简便,或者说提高精度,我们在存储时只存储小数部分。

例如:

  • V = 5.5 二进制表达方式是 101.1 科学计数法是 1.011,而M在内存中只存储011这个。
  • 而又因为,M在内存中占有23个比特位或者是52个比特位,因此未占满的部分使用0代替。
  • 而只存储小数部分的原因是,通过科学计数法,我们留下了一位整数,这位整数在科学计数法的情况下必然是1,所以我们默认将1省略,只有取出存储数据的时候才会加上。

 关于E:

E的情况较为复杂,因为E必须是一个无符号的整型数值,但是作为科学计数法的E是会出现负数的。

例如:

数据在内存中的存储(2)_第7张图片

所以,这时候我们就出现了一个中间值! 

  • 32位浮点数的中间值是127,64位数浮点数的中间值是1023。
  • 当我们的E存入数据中时,必须先加入127或者1023,然后变成二进制形式。 
  •  注意,加上中间值是基本都能修正好这个问题的。

数据在内存中的存储(2)_第8张图片 

转化案例: 

V = 5.5  ——十进制

V = 101.1  —— 二进制

V = 1.011*2^2 ——科学计数法

V =  (-1)^ 0 * 1.011 * 2 ^ 2  —— IEEE754

V =  0 10000001  011 00000000000000000000

V =  4 0 b0 00 00 ——数据存储再内存后,使用16进制再内存块中的展示

————以小端字节进行展示! 

3、关于取出浮点数再内存中的数据

关于取出数据,只需要观察E的情况。

3.1、E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

比如:

0.5 的二进制形式为0.1

  • 由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1)。
  • 其E再内存应该先为-1+127(中间值)=126,表示为01111110。
  • 而M = 1.0 则去掉整数部分为0,补齐0到23位00000000000000000000000。

所以其最后二进制表示形式为: 

 

3.2、E全为0

全0情况,存储在内存中是加了127或者1023的,而这种加了后还全0的情况那么E就是-127或者-1023,所以这种数字(整个浮点数)表示的就是无限接近与0的数。

那么这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示+0,以及接近于0的很小的数字。

3.3、E全为1

这时,如果有效数字M全为0,表示无穷大(正负取决于符号位s)。 

 

你可能感兴趣的:(C语言,数据存储,c语言,数据结构,数据存储)