C语言中float double等类型在内存中的存储
问题:十进制数4.5的单精度表示和双精度表示:
备注: 最高位符号位 0表示整数 1表示负数
阶码: 表示的是2的多少次幂这个幂指数
尾数:将其表示成科学计数法之后的舍去科学计数法表示的最高位为1的码数
大致步骤是酱紫滴:
- 把4.5写成二进制:整数部分4=100,小数0.5*2=1.所以4.5(10进制)=100.1(2进制);
- 写成指数形式:100.1=1.001*2^2;
- 对于单精度来说有4个字节32位,我们通常用第32位(最高位)表示符号;用接下来的八位表示指数;用剩下的23位表示尾数;
- 对于上面那个数来说,符号为正,符号位为0;指数为2,这里使用移位存储的方式,要把指数变成2+127=129,二进制是1000 0001(红色部分);尾数位为1.001,因为表示成指数后第一位都是1,就给省了,只记录.001即可;
- 综上 4.5的单精度表示为 0100 0000 1001 0000 0000 0000 0000 0000;
- 写成16进制:40 90 00 00;存储时反向存储即可得到结果。(小端存储模式)
- 对于双精度来说有8个字节64位,一般用最高位表示符号位;用接下来的11位表示指数;用剩下的52位表示尾数;
- 指数本来是2,在做移位存储时要加上2^10-1=1023,即2+1023=1025,指数位存储的是1025的二进制编码1000 0000 001(红色部分);
- 4.5的双精度表示为0100 0000 0001 0010 0000 0000 0000 ……
- 写成16进制:40 12 00 00 00 00 00 00;存储的时候也要反过来存。
Ps: 移位存储可以参看链接,主要思想就是要避免+0和-0的同时出现,并且能增大表示范围。操作方法就是,如果我们想用n位来存储带符号的整数a,那么做移位存储的时候就要存储a+( 2^(n-1) - 1 ) 的相应的二进制码;如n=8, a=2时,我们要存2+(2^7-1)=129的二进制码.
移位存储:http://3y.uu456.com/bp_3fcoo8iccx7z7sg756cv_1.html
可以参考下面的博文:
浮点数的二进制表示学习笔记(有很多相应的例题): http://blog.163.com/yql_bl/blog/static/847851692008112013117685/
http://blog.csdn.net/zmq5411/article/details/6301250