2013-07-18 14 views
7

私は4バイトを取り込み、IEEE-754フロートに変換する必要のあるプログラムを持っています。バイトは順不同で転送されますが、順番に並べ替えることができます。私の問題は、それらをフロートにキャストしています。コードの関連部分:浮動小数点型バイト配列をキャスト

//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; 

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

これはなぜ動作しないのですか?それは、私が作業するコードを受け取ったときに私には正しいと見えました。そして、それはオンラインの一般的な解決策であるようですが、私はちょうど困惑しています。

+0

を、あなたは彼らが順不同で転送されていますか?私が '0x41d7d1e1'を16進数に入れてコンバータを浮動させると、〜27が得られました。これはいい数字のようです。 –

+5

エンディアン問題ですか? –

+0

'0xD1E141D7'から何を得ると思いますか? – triclosan

答えて

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 
+0

「-483860023749617123328.000000」が「26.977480」よりも優れていると判断した方法 – triclosan

+0

彼は、彼はちょうど間に決定するための著者のための両方のオプションを提示しました... –

+6

@triclosanおそらく '-483860023749617123328.000000'は物理的に不可能なので、摂氏、華氏またはケルビン度ですか? –

関連する問題