Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1304611
  • 博文数量: 92
  • 博客积分: 10389
  • 博客等级: 上将
  • 技术积分: 1918
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-10 16:13
文章存档

2014年(1)

2012年(15)

2009年(6)

2008年(37)

2007年(72)

2006年(54)

我的朋友

分类: LINUX

2008-01-15 08:49:34

一般说来double类型都是8字节的。但是在某些单片机里面是4字节的,如atmega64L中就是4字节的。
 
知道double存储的理由:
而有时候我门在做浮点数运算,以及输出,或者在用字符来显示的时候就需要知道,它是如何在内存中存储的,要知道printf在单片机中可不想在32位CPU里面支持的那么强大。因此你在csdn中是找不到答案的,因为我没找到,呵呵,可能你运气比我好哦。
 
0x40123012(hex)=(4字节是32位,因为最高为是0,要补全)(0)100 0000 0001 0010 0011 0000 0001 0010
 
转变成小数表示过程:
 
第32位表示正负:
接下来的8位是移位因子:这里是100 0000 0=128
那么因子就等于128-127=1;
就是2的一次方:2^1=2^(128-127)=2^(0x80-127)=2
 
8位的移位因子后的第一位是0
那么就表示为(1/2)*0
在下一位是0;
那么就表示为(1/(2*2))*0
在下一位是1;
那么就表示为(1/(2*2*2))*1=0.125;
依次类推:一般根据你的精确要求来确定,后面的小数的要多少为,就是要8位移位因子后面多少位
 
最终结果就是+(2^(0x80-127))*(0.125。。。。。。。)约等于0.25。。当然还要加1。就是1.25
我只说了计算过程:
 
 
 
想要全面理解的话,大家去搜索ieee 74几。就是标准C对double的规定了。是intel策划的结果。
 
 
 
 
 
 
 
 
下面有一更详细的转贴:
 
 
 
 
 
 
任何一个数都可以按科学计数法表示成A×10的B次方的形式,其中1.0≤A<10,B为整数。同样的道理,也可以表示成C×010的D次方的形式,其中010表示2的二进制表示,C为二进制浮点数,D为二进制整数。例如5.0用二进制表示就是0101,也就是可以表示成(1.01)×010的2次方的形式。知道了这点,我们来看一下在VC里面是怎样来存储double型数据的。
在VC里面,double型数据占据了8个字节,共64位。
最高位是符号位,0表示正,1表示负。
接下来的11位表示指数,用移码表示,关系为:11位数组成的值(无符号)-1023=指数,如上所示5.0的指数部分是2,11位数组成的值应该是1025,即100 0000 0001
余下的52位是小数位,其中1.0……中的1是默认的,没有占据位数。5.0的小数部位是1.01,则它的小数位在内存中应该表示成0100 0000 0000 ……0000(共52位)
所以+5.0在内存中存储的形式应该是0100 0000 0001 0100 0000 …… 0000即0x40140000 00000000。
下面我们通过一个程序来验证一下:
#include "stdafx.h"
#include "iostream.h"

typedef union tagOct
{
   double dData;
   int nData[2];
}Oct;

int main(int argc, char* argv[])
{
   Oct a;
   a.nData[0]=0;
   a.nData[1]=0x40140000;
   cout<   return 0;
}
相信这段代码很好理解,先通过整形数组给共用体赋值,再以浮点的形式输出,最后的结果果然是5。如果把0x40140000改成0xC0140000呢,相信你很快就得到答案,是-5,不相信?去试试吧。
附:float型和double型基本一样,只是它用8位表示指数,用23位表示小数,另外它的移码表示不是相差1023(2的10次方-1),而是127(2的7次方-1)。有兴趣可以试验一下。
阅读(6082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~