Chinaunix首页 | 论坛 | 博客
  • 博客访问: 568213
  • 博文数量: 190
  • 博客积分: 10937
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-07 11:28
文章分类

全部博文(190)

文章存档

2012年(1)

2011年(27)

2010年(20)

2009年(142)

我的朋友

分类: C/C++

2009-12-07 11:53:37

根据IEEE的标准,浮点数的定义如下 
                            符号位     指数位             小数部分          指数偏移量   
  单精度浮点数  1  位[31]  8位  [30-23]    23位  [22-00]  127   
  双精度浮点数  1  位[63]  11  位[62-52]  52  位[51-00]  1023   
  我们以单精度浮点数来说明: 
  符号位,表述浮点数的正或者负 
  指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示 
  在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂 
  这个数据格式当中的,指数是8位,可表达的范围是0到255(移码表示,偏移127)
  而对应的实际的指数是-127到+128
  实际的小数在这个小数前面还保留了一个1 
  拿浮点数1.0来说 
  符号位是0,  实际指数是0,对应这里的指数就是127了,也就是0x7f 
  而小数部分就是1.0了,  1是暗含的不存储,实际的小数部分就是0了 
  因此组合起来的数据就是,0x3f80000

1.88 的二进制为 1.11100001010001111010111 刚好23位小数,指数0 实际存储为:3FF0A3D7,读出来还是1.88
18.8 的二进制为 10010.110011001100110011001101 = 1.0010110011001100110011001101 * 2的4次方
尾数部分28位,存储时最后5位没了,实际存储为:41966666,所以读出来就是18.799999

测试程序:
#include
int main(int argc, char* argv[])
{
 float a=18.8;
 printf("%f\n%08X\n%08X\n",a,&a,*(int *)&a);
 return 0;
}

二进制转换方法:整数 除2取余,小数 乘2取整

阅读(1299) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~