该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit,我们在声明一个变量float f = 2.25f的时候,是如何分配内存的呢?其实不论是float类型还是double类型,在计算机内存中的存储方式都是遵从IEEE的规范的,float 遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度,在内存存储中都分为3个部分:
1) 符号位(Sign):0代表正,1代表为负;
2) 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;
3) 尾数部分(Mantissa):尾数部分;
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制 的科学计数法表示就为:8.25* 10^0,而120.5可以表示为:1.205*10^2。而我们傻蛋计算机根本不认识十进制的数据,它只 认识0和1,所以在计算机内存中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示 为:1110110.1。用二进制的科学计数法表示1000.01可以表示为1.00001*2^n ,1110110.1可以表示为 1.1101101* 2^n,任何一个数的科学计数法表示都为 1.xxx*2^n , 尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,