在C语言中对于float,用4字节存储,
比如
1.618000 ,在内存中为 160 26 207 63
1.000000, 在内存中为 0 0 128 63
那么我有4个字节数据,比如{160 26 207 63},怎么转成float呢?
其实很简单:
float f;
unsigned char *p = (unsinged char*)&f;
p[0]=160;
p[1]=26;
p[2]=207;
p[3]=63;
然后f,就是1.618了。
但是有些时候,没有用内存直接赋值的这种方法,比如glsl中,
那就需要根据IEEE754标转来进行转换了。
#include
typedef unsigned char byte;
float b2f(byte m0, byte m1, byte m2, byte m3)
{
// 求符号位
float sig = 1.;
if (m0 >=128.)
sig = -1.;
printf("sig %f\n",sig);
//求阶码
float jie = 0.;
if (m0 >=128.)
{
jie = m0-128. ;
}
else
{
jie = m0;
}
jie = jie * 2.;
if (m1 >=128.)
jie += 1.;
printf("jie %f\n",jie);
jie -= 127.;
printf("jie %f\n",jie);
//求尾码
float tail = 0.;
if (m1 >=128.)
m1 -= 128.;
tail = m3 + (m2 + m1 * 256.) * 256.;
printf("tail %f\n",tail);
tail = (tail)/8388608; // 8388608 = 2^23
printf("tail %f\n",tail);
float f = sig * pow(2., jie) * (1+tail);
return f;
}
int main(int argc, char *argv[])
{
float f = 1;
byte *pf = (byte *)&f;
printf("F: %f %d %d %d %d \n", f, pf[0], pf[1], pf[2], pf[3]);
//float 低位在前
byte m0 = pf[3]; //高字节
byte m1 =pf[2];
byte m2 = pf[1];
byte m3 = pf[0]; // 低字节
f = b2f(m0, m1, m2, m3);
printf("b2f %f\n", f);
reutrn 0;
}