浮点数在内存中的存储

正数在内存的存储是以最高位为符号位,其余为数值的二进制序列,那么浮点数在内存中是怎么进行存储的呢,接下来我们一起看一看;

假设一个数为1154,那么用科学记数法可以表示为1.154*10^3,同理在计算机中也可以用科学计数法进行存储,那么他是怎么进行的呢?

比如:10在计算机中是以二进制储存的,即1010,转化为科学技术法为 (-1)^s* 1.01*2^3;
规定有,s为符号位,0代表正数,1代表正数,M=1.01代表有效数字,E=3, 2^E代表指数位;
对于32位浮点数,最高的一位比特位是符号s位,接下来的8位是指数E,剩下的32位为有效数字M,如图所示:
浮点数在内存中的存储

1.M的存储:在上述中,可以清晰的认知到1<=M<2,即M的首位永远都是1,那么进行存储时就被不在对1进行存储,只存1后面的数字,如此一来M可以保存24位有效数字;
M的存储是在图中M位处的最左端开始,多余的比特位补0处理;

2.E的存储:很显然E是一个无符号整数,8个bit取值范围为0-255,又可知科学计数法中指数是可以出现负数的,那么就有了规定,当存储E的时候需要加上127,即2^10,存储的是 E=10+127;

3.E的读取:第2点讲到,E存储的时候是加上127的,当然读取的时候也要减去127,可是有如下2种特殊情况:
3.1.当E为全0时,很显然读取E的时候减去127为-127,那么很容易理解这样一来2^E会非常小近乎于0,计算机就将此时的浮点数表示为0,并且这个0值不是唯一的;
浮点数在内存中的存储
如图,当E取值靠近0时,E-127的值都非常小,整个浮点数的值也会趋近于0,在这个区间内有无数个E值使得浮点数的值表示为0,因此在进行浮点数的判断的时候不能直接如下所示
if(floa==0),而应该表示为一个区间,例如if(floa<-10^-9 && floa>-10^-9),因为浮点数的0值是一个区间;

3.2当E为全1时,这是2^E就会非常的大,即达到了浮点点数极值,S位决定了浮点数的取值区间;

附:64位双精度浮点数中,E的比特位为11位,M为52位,E进行存取时加减1023,其余同理;

深度理解,图文解析

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