Ich verwende den XC32-Compiler von Microchip, der auf dem Standard-C-Compiler basiert.Interpretieren eines 32bit unsigned long als Single Precision IEEE-754 Float in C
Ich lese einen 32bit-Wert von einem Gerät in einem RS485-Netzwerk und speichert dies in einem unsigned long, dass ich als DWORD typedef definiert habe.
heißt
typedef DWORD unsigned long;
Wie es aussieht, wenn ich diesen Wert auf einen Schwimmer typisieren, der Wert I erhalten, ist im Grunde die Floating-Point-Version davon ist Integer-Darstellung und nicht der richtige IEEE-754 interpretiert Schwimmer.
dh
DWORD dword_value = readValueOnRS485();
float temp = (float)dword_value;
Hier dword_value würde im HEX-Format als 0x4366C0C4 kommt durch, die als eine Dezimalzahl als 1130807492 dargestellt werden würde, so dass die Schublade gesteckt dies zu einem Schwimmer einfach gibt mir 1,130807492 * 10^9 oder 1130807492,0 was ich nicht will.
Ich mag die einfache Genauigkeit IEEE-754-Darstellung, die mir einen Float-Wert von 230,75299072265625
für mich So klar typecasting zu schweben nicht geben würde funktionieren. Ich brauche eine Methode, die diese Form mir konvertieren kann. Ich habe überall in der XC32-Bibliothek nachgeschaut und kann nichts finden.
Kennt jemand eine vordefinierte Methode, die diese Interpretation richtig für mich tut? Oder gibt es vielleicht eine vorgeschlagene Methode, die ich schreiben kann? Ich versuche zu vermeiden, meinen eigenen Code für diese spezielle Aufgabe zu schreiben, da ich mir Sorgen mache, dass ich keine effiziente Lösung finde, wenn C dafür bereits eine Funktion hat.
Die interessante Sache ist, wenn ich dies zu einem char * zu tun, wird der Wert an diesem Zeichen * dargestellt korrekt als 230.75:
sprintf(random_char_pointer, "%.2f, dword_value);
Hier Druck random_char_pointer zu Bildschirm gibt mir 230.75 so muss der sprintf sein das Dolmetschen für mich richtig handhaben. Ich gehe daher davon aus, dass es für mich schon etwas in C gibt. Kann jemand helfen?
'f = * (float *) & uvalue;' (plus/minus Ausrichtung Überlegungen) – joop
@joop Ist das nicht gleichbedeutend mit einem 'float'? – Downvoter
Nein, ich werfe einen unsigned int * -Zeiger * auf einen float * -Zeiger * und dereferenziere ihn. – joop