首先要理解十六进制在内存中保存的形式,如下:
double在内存中是以八个字节保存的,即64bit,那么最高一位表示符号位,中间11位为阶码,那么最后52位则是尾数。
如:125.12在内存保存的形式为:48 E1 7A 14 AE 47 5F 40
这是低位在前,高位在后:48 E1 7A 14 AE 47 5F 40
高位在前,低位在后则是:40 5F 47 AE 14 7A E1 48
转换成2进制则是:0 10000000101 1111010001111010111000010100011110101110000101001000
符号位 阶码 尾数即底数
从而知道该数为正数,符号位为0表示正数,1表示负数
指数为阶码减去1023,10000000101的十进制为:1029,指数=1029-1023=6
1 111101 0001111010111000010100011110101110000101001000,在从底数算起时,要多加一个1
整数 1.0/(0*2^1)+1.0/(0*2^2)+1.0/(0*2^3)+1.0/(1*2^4)+1.0/(1*2^5)+1.0/(1*2^6)+1.0/(1*2^7)+...
前的1是手动加上去的
最后得整数为125,小数为:0.120000
相应的c++代码:
-
#include "stdafx.h"
-
#include <iostream>
-
#include <stdio.h>
-
#include <iomanip>
-
using namespace std;
-
typedef struct tag_stTA // 实时数据
-
{
-
double fValue; //对应系统中数据对象的状态
-
}TA;
-
long long int getS(int e,int m)
-
{
-
long long int s=e;
-
for (int i=1;i<m;i++)
-
{
-
s*=e;
-
}
-
return s;
-
}
-
int _tmain(int argc, _TCHAR* argv[])
-
{
-
TA ta;
-
BYTE p[8];
-
int sz = sizeof(TA);
-
ta.fValue=-6034578415500000.12;
-
memcpy((BYTE *)p,&ta, sz);
-
printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]);
-
long long int a=0x0000000000000000;
-
a=a|p[7];
-
a=(a<<8)|p[6];
-
a=(a<<8)|p[5];
-
a=(a<<8)|p[4];
-
a=(a<<8)|p[3];
-
a=(a<<8)|p[2];
-
a=(a<<8)|p[1];
-
a=(a<<8)|p[0];
-
int s=(a>>63)&0xFF;//获得符号位,1表示负数,0表示正数
-
int e=(a>>52)&0x7FF;
-
e=e-1023;//获得指数
-
long long int m=a&0xFFFFFFFFFFFFF|0x10000000000000;//获得底数
-
//cout<<setiosflags(ios::uppercase)<<hex<<m<<endl;
-
long long int c=0;
-
double v=0.0,y=1.0;
-
if (e>=0)//向右移动
-
{
-
c=(m>>(52-e))&0xFFFFFFFFFFFFFFFF;//获得整数的二进制
-
long long int b=0;
-
for (int i=0;i<52-e;i++)
-
{
-
b=(b<<1)|0x01;
-
}
-
b=b&m;//获得小数的二进制
-
int j=0;
-
for (int i=52-e-1;i>=0;i--)
-
{
-
j++;
-
y=(double)(((b>>i)&0x01)*getS(2,j));
-
if (y>0.0)
-
{
-
v+=1.0/y;
-
}
-
}
-
v=c+v;
-
if (s>0)
-
{
-
v=-v;
-
}
-
}
-
else//向左移动
-
{
-
e=-e;
-
c=m;
-
int j=0;
-
for (int i=52+e-1;i>=0;i--)
-
{
-
j++;
-
y=(float)(((c>>i)&0x01)*getS(2,j));
-
if (y>0.0)
-
{
-
v+=1.0/y;
-
}
-
}
-
if (s>0)
-
{
-
v=-v;
-
}
-
}
-
printf("%.2f\n",v);
-
return 0;
-
}
阅读(8364) | 评论(0) | 转发(0) |