有三个十六进制数据为0x03,0xDF,0xE5,我把它们放在一个ph[3]的uchar型数组里,想编程得到float型的ph值,以下是转换原理:
0 1 2
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- + E E E E E E s s s s s s s s s s s s s s s s
0 0 0 0 0 0 1 1 (03)
1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 (DF CF)
第一位 (-) 是这个数的符号,0为正,
第二位(+) 是指数的符号,
EEEEEE 是指数,
ss...s 是小数部分. (+前缀变为 0.sssssssssssssssss)
例如:
03 DF CF = (+)0.1101111111001111 * 2^( +000011 ) = 0.8742523193359375 *2^3 = 6.99
我自己写的程序是:(编译有错误)
#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar ph[3]={0x03,0xDF,0xE5};
float x;
uchar i;
float ToSingle( );
void main(void)
{
x = ToSingle(ph,0);
}
float ToSingle(value, startIndex)
uchar value [3];
uint startIndex;
{
uchar j;
double t = 0;
double s = 0.5;
uchar b = value[startIndex + 1];
for (j = 0; j < 8; j++)
{
if ((b & 0x80) != 0) t += s;
b <<= 1;
s /= 2;
}
b = value[startIndex + 2];
for (j= 0; j < 8; j++)
{
if ((b & 0x80) != 0) t += s;
b <<= 1;
s /= 2;
}
b = value[startIndex];
return (float)(t * Pow(2, 3) * sign0);
}
我第一次用KeilC编,希望大家帮帮忙,指点指点,小妹在此谢过了!!