float,int都以二进制方式在内存中存储,都占8字节;
例如int=9;00000000 00000000 00000000 00001001;
那么float的数如何转为二进制如何存呢;
他有一套独特的规矩如下,如果我会在最后几个例子。
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式: V = (-1)S ∗ M ∗ 2E
• (-1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2E 表⽰指数位
举例来说:
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
float类型浮点数内存分配
double类型
这段知识转载比特就业课,这是鹏哥让写的作业,所以我转载了所需要的内容。
几个实例方便大家理解
5.0--10进制
101.0(5.0) 二进制表示形式=小数点向左移动2为有效数组变为1.01
(-1)^0*1.01*2^2 ,因为移动了俩位所以是2的2次方(^是次方的意思)
综上s=0
m=1.01
e=2
那么小数点后的位怎么处理呢?
5.5--10进制单独拿0.5出来
0.5—>>0.1 运算过程(1*2^-1) 他的结果就是0.5用小数点后1,0去配凑那位是1就去成2的—几次方
有些数据无法用float精准的去存
0.14-->>0.001 1*2^-3=0.125后面还要去凑位0.015;(令第3位为1成2的负3次方配出0.125)
总之小数点后面用0.1011哪一位是1就用它成—2^负几位次方
反正后面不要写0,1以外的数字,
5.5-->101.1;-1^0*1.011*2^2;
s=0,E=2,M=1.011
根据上图s占1bit
E占8个bit
m剩下的在最后的23bit位前写小数后3位剩下补零
E+127=129如此存进去double类型就加1023(为了修正e为负数的形式,不细讲,float,double有自己的取值范围(就像int 65535那样)不用担心-130,-1040的情况)
所以就是这么存的
0 10000001 01100000000000000000000
所以你懂了吗???