将二进制转换为浮点数

时间:2013-05-17 19:40:41

标签: c floating-point

我正在尝试从原始二进制字符串中分配一个浮点数,但是我得不到我期望的结果。

int main()
{
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78};
    float tempFloat;
    int position = 3;

    printf( "recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]);
    memcpy( &tempFloat, recBuffer + position, 4 );
    printf( "tempFloat=%f (0x%x)\n", tempFloat, tempFloat );
    return 0;
}

我的输出如下:

recBuffer=0x12345678
tempFloat=*************************************** (0x40000000)

以上程序适用于整数:

int main()
{
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78};
    int tempFloat;
    int position = 3;

    printf( "recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]);
    memcpy( &tempFloat, recBuffer + position, 4 );
    printf( "tempFloat=%d (0x%x)\n", tempFloat, tempFloat );
    return 0;
}

输出:

recBuffer=0x12345678
tempFloat=2018915346 (0x78563412)

(我知道Endianness。)

我试图直接指定浮点数,但我仍然得到一些奇怪的输出(所有*的意思是什么?)。

int main()
{
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78};
    float* tempFloat;
    int position = 3;

    printf( "recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]);
    tempFloat = (float*)(recBuffer + position);
    printf( "tempFloat=%f (0x%x)\n", *tempFloat, *tempFloat );
    return 0;
}

带输出:

recBuffer=0x12345678
tempFloat=*************************************** (0x40000000)

任何二进制序列都应该给我一个输出,如0x78563412 = 1.73782443614495040019632524267E34。我不确定为什么0x40000000 = * 。它应该是2.0E0。 我究竟做错了什么?!任何帮助将不胜感激!

(不幸的是我正在使用旧的QNX机器,没有调试器。只需简单的printf()来帮助我。

2 个答案:

答案 0 :(得分:1)

printf( "tempFloat=%d (0x%x)\n", tempFloat, tempFloat);
                          ^                     |
                          |                     |
                          +---------------------+

%x说明符对整数有用,但您将float值传递给printf。所以输出不是一个有意义的值。

答案 1 :(得分:0)

int main(){
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78};
    float tempFloat;
    int position = 3;

    printf( "recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]);
    memcpy( &tempFloat, recBuffer + position, 4 );
    printf( "tempFloat=%f (0x%x)\n", tempFloat, *(unsigned*)&tempFloat );
    return 0;
}
/*
recBuffer=0x12345678
tempFloat=17378244361449504000000000000000000.000000 (0x78563412)
*/