2013-07-18 6 views
7

Mam program, który musi zajmować 4 bajty i konwertować je na zmienną IEEE-754. Bajty są przesyłane poza kolejnością, ale mogę je przywrócić w porządku. Mój problem polega na tym, że rzucają je w ruch. Odpowiednie części kodu:Tablica bajtów do 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; 

lWhole jest długa i stevenFloat jest pływak. Podczas debugowania widzę, że wartości przypisane do tablicy bajtów są przechowywane poprawnie, jednak wartości stevenFloat i lWhole są niepoprawne. Wydaje się, że znajdują się blisko wartości 0 lub zbliżają się do maksymalnych wartości zmiennoprzecinkowych/długich. Długi i zmiennoprzecinkowy są 32 bitowe z moim kompilatorem.

Czy ktoś wie, dlaczego to nie działa? Wydaje mi się to poprawne, gdy otrzymałem kod do pracy i wydaje się, że jest to powszechne rozwiązanie w Internecie, jestem po prostu zakłopotany.

+0

Czy na pewno są one przenoszone w porządku? Kiedy wstawiam '0x41d7d1e1' do konwertera heksadecymalnego, mam ~ 27, co wydaje mi się fajną liczbą. –

+5

Problem endianness? –

+0

czego można się spodziewać po '0xD1E141D7'? – triclosan

Odpowiedz

10

Rzeczywiście, jest to problem kolejność bajtów:

#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; 
} 

Drukuje:

-483860023749617123328.000000 
26.977480 
+0

jak zdecydowałeś, że '-483860023749617123328.000000' jest lepszy niż' 26.977480' – triclosan

+0

Nie, po prostu przedstawił obie możliwości wyboru między autorem ... –

+6

@triclosan Być może dlatego, że "-483860023749617123328.000000" jest fizyczną niemożliwością, czy to w stopniach Celsjusza, Fahrenheita czy Kelvina? –