浮点数在计算机中的的存储
对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit.其实不论是float类型还是double类型,在计算机内存中的存储方式都是遵从IEEE的规范的,float 遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度,在内存存储中都分为3个部分:
-
符号位(Sign):0代表正,1代表为负;
-
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;
-
尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为:
附注:将一个float型转化为内存存储格式的步骤
(1)先将这个实数的绝对值化为二进制格式。
(2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
(3)从小数点右边第一.位开始数出二十三位数字放入第22到第0位。(4) 如果实数是正的,则在第31位放入“0”,否则放入“1”。
(5) 如果n是左移得到的,说明指数是正的,第30位放入“1”;如果n是右移得到的或n=0,则第30位放入“0”。
(6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位;如果n是右移得到的或n=0,则将n化为二进:制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。
1.因为M(小数点左边)的值一定是1<= M <2,所以它绝对可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字。这样做节省了空间,以float类型为例,就可以保存23位小数信息,加上舍去的1就可以用23位来表示24个有效的信息。
2.对于E(指数)E是一个无符号整数所以E的取值范围为(0 ~~255),但是在计数中指数是可以为负的,所以规定在存入E时,在它原本的值上加上中间数(127),在使用时减去中间数(127),这样E的真正取值范围就成了(-127~128)。