[C语言]浮点数在内存中的存储相关知识点

先从一道例题开始:

[C语言]浮点数在内存中的存储相关知识点_第1张图片

                                                             图  1                      [C语言]浮点数在内存中的存储相关知识点_第2张图片

                                                             图  2

 从上述例题我们知道,整形和浮点型的内存存储方式有不同之处;

下面进行详细解读:

根据国际标准IEEE 754,任意一个二进制浮点数V可以表达成以下的形式:

->> (-1)^S*M*2^E;

->> (-a)^S表示有效符号位,当s=0,V为正数,当s=1时,V为负数;

->> M表示有效数字,大于等于1,小于2;

->> 2^E表示指数位;

->举例来说:

1.十进制的5.0,写成二进制是101.0,相当于1.01*2^2。那么按照上面V的格式,可以得出:  s=0;M=1.01;E=2;

2.十进制的-5.0,写成二进制是-101.0,相当于-1.01*2^2。那么按照V的格式,可以得到:                     s=1;M=1.01;E=2;

浮点数的存入:

-->>IEEE 754规定:对于32位的浮点数,最高一位的符号是s,接着的8位是指数E,剩下23位为有效数字M,如下所示:

[C语言]浮点数在内存中的存储相关知识点_第3张图片

                                                             图  3

 对于64位的浮点数,最高一位的符号是s,接着的11位是指数E,剩下52位为有效数字M,如下所示:

[C语言]浮点数在内存中的存储相关知识点_第4张图片

                                                             图  4

->>需要特别注意:

[C语言]浮点数在内存中的存储相关知识点_第5张图片

                                                             图  5 

->>对于(-1)^0*1.01*2^2而言,内存中仅会储存1.01中的01,等到拿出来的时候才会将1补上;

[C语言]浮点数在内存中的存储相关知识点_第6张图片

                                                             图  6

->> 例如0.5的二进制为0.1,也就是(-1)^0*1.0*2^-1;因此由上述规定,再将S,M,E存储到内存中的时候: S=0;M=1.0;E=-1+中间数(127)=126;

->>下面再举一个例子:float f=5.5;其二进制为101.1=>>(-1)*1.011*2^2;S=-1,M=1.011,E=2;存进内存的时候E变成129;由图4,其内部结构的二进制序列为:0 10000001 01100000000000000000000;故十六进制转换会成为:40 b0 00 00;存入内存中,由小端存储方式知:内存中为 00 00 b0 40;

浮点数的取出:

可以分为三种情况:

1.E不为1或0:

 0 01111110 0000000.....000000;

2.E等于0:

例如二进制序列0 0000000 01100000000000000000000,则还原时表示为:->>

0.011*2^-126,即为真实值;

3.E等于1时:

例如二进制序列0 11111111 01100000000000000000000,则E=255-127=128;则(-1)*(0/1)*1/2^128将会是正负无穷大的值。

 

->>最后是开始题目的一个详解:

[C语言]浮点数在内存中的存储相关知识点_第7张图片

你可能感兴趣的:(c语言,c++,数据结构,开发语言)