8

4 バイトを取り込んで IEEE-754 float に変換する必要があるプログラムがあります。バイトは順不同で転送されますが、順番に戻すことができます。私の問題は、それらをフロートにキャストすることです。コードの関連部分:

//Union to store bytes and float on top of each other
typedef union {
    unsigned char b[4];
    float f;
} bfloat;

//Create instance of the union
bfloat Temperature;

//Add float data using transmitted bytes
MMI.Temperature.b[2] = 0xD1;//MMIResponseMsg[7];
MMI.Temperature.b[3] = 0xE1;//MMIResponseMsg[8];
MMI.Temperature.b[0] = 0x41;//MMIResponseMsg[9];
MMI.Temperature.b[1] = 0xD7;//MMIResponseMsg[10];

//Attempting to read the float value
lWhole=(long) ((float)MMI.Temperature.f);
//DEBUGGING
stevenFloat = (float)MMI.Temperature.f;

lWholelong でstevenFloatfloat です。デバッグすると、バイト配列に割り当てた値が正しく格納されていることがわかりますが、 と の値はstevenFloat正しくありませんlWhole。それらは 0 に近いか、最大 float/long 値に近いように見えます。私のコンパイラでは、 long と float はどちらも 32 ビットです。

これが機能しない理由を誰かが知っていますか? 作業するコードを受け取ったとき、それは正しいように見えましたが、それはオンラインで一般的な解決策であるように見えます.私はただ困惑しています.

4

1 に答える 1

10

実際、これはエンディアンの問題です。

#include <stdio.h>
#include <stdint.h>

int main()
{
    union {
        uint8_t bytes[4];
        float f;
    } fun1 = { .bytes = { 0x41, 0xd7, 0xd1, 0xe1} }, fun2 = { .bytes = { 0xe1, 0xd1, 0xd7, 0x41} };

    printf("%f\n%f\n", fun1.f, fun2.f);

    return 0;
}

これは以下を出力します:

-483860023749617123328.000000
26.977480
于 2013-07-18T19:59:58.663 に答える