C++解析IEEE754中float格式的数据

来源:互联网 发布:手机代理软件免费 编辑:程序博客网 时间:2024/05/18 00:52
#include<iostream>using namespace std;void FloatToBuf(float num, unsigned char buf[4]);float BufToFloat(unsigned char buf[4]);int main(){    float f = 639.5f; //待转换的浮点数    int *p = reinterpret_cast<int *>(&f);    for(int i = 31; i >= 0; i--) //原始的二进制位    {        cout << (*p >> i & 1);        if(i % 8 == 0)        {            cout << ' ';        }    }    cout << endl;    unsigned char buf[4];    FloatToBuf(f, buf);    for(i = 0; i < 32; i++) //转换后的大端模式二进制位    {        cout << (buf[i / 8] >> (7 - i % 8) & 1);        if(i % 8 == 7)        {            cout << ' ';        }    }    cout << endl;    cout << BufToFloat(buf) << endl; //再转回去的浮点数    return 0;}void FloatToBuf(float num, unsigned char buf[4]){    float item = 0.5f;    int index = 0, i;    if(num == 0.0f)    {        buf[0] = buf[1] = buf[2] = buf[3] = 0;        return;    }    if(num > 0.0f)    {        buf[0] &= ~(1 << 7);    }    else    {        buf[0] |= (1 << 7);        num *= -1.0f;    }    while(num >= 2.0f)    {        index++;        num /= 2.0f;    }    num -= 1.0f;    for(i = 9; i < 32; i++, item /= 2.0f)    {        if(num >= item)        {            buf[i / 8] |= (1 << (7 - i % 8));            num -= item;        }        else        {            buf[i / 8] &= ~(1 << (7 - i % 8));        }    }    if(num >= item)    {        for(i = 31; i > 8; i--)        {            if(buf[i / 8] >> (7 - i % 8) & 1)            {                buf[i / 8] &= ~(1 << (7 - i % 8));            }            else            {                buf[i / 8] |= (1 << (7 - i % 8));                break;            }        }        if(i == 8)        {            index++;        }    }    index += 127;    for(i = 8; i > 0; i--)    {        if(index >> (8 - i) & 1)        {            buf[i / 8] |= (1 << (7 - i % 8));        }        else        {            buf[i / 8] &= ~(1 << (7 - i % 8));        }    }}float BufToFloat(unsigned char buf[4]){    float sum = 1.0f, item = 0.5f;    int index = 0, base = 1, i;    for(i = 9; i < 32; i++, item /= 2.0f)    {        if(buf[i / 8] >> (7 - i % 8) & 1)        {            sum += item;        }    }    for(i = 8; i > 0; i--, base *= 2)    {        if(buf[i / 8] >> (7 - i % 8) & 1)        {            index += base;        }    }    if(index > 0)    {        index -= 127;        if(index > 0)        {            while(index--)            {                sum *= 2.0f;            }        }        else        {            index *= -1;            while(index--)            {                sum /= 2.0f;            }        }    }    else    {        sum -= 1.0f;    }    if(buf[0] >> 7 & 1)    {        sum *= -1.0f;    }    return sum;}
0 0
原创粉丝点击