Ich habe eine float
Variable , die ich über ein CAN-Protokoll senden muss. Um dies zu tun, muss dieser Float von 32 Bits in 4 uint8_t
variables geschnitten werden.
Ich habe absolut keine Ahnung, wie es geht. Ich dachte zuerst daran, den Float in einen Int zu konvertieren, aber einige Antworten, die ich im Internet gefunden habe, die Cast oder Union verwenden, scheinen nicht zu funktionieren.
Hier ist ein einfaches Beispiel für das, was ich versuche:
%Vor%Danke.
Sie können diese illegale Operation ausführen:
%Vor%Obwohl dies die meiste Zeit funktioniert, wird es vom C ++ - Standard nicht unterstützt und Compiler erzeugen möglicherweise Code mit undefiniertem Verhalten.
Eine andere Lösung ist die Verwendung von Unionen:
%Vor%Es ist unklar, ob alle Compiler konsistente Ergebnisse liefern, aber es scheint sicherer als der erste Ansatz.
Sie können auch den Wert von f
in eine 32-Bit-Ganzzahl packen. Dies kann jedoch dazu führen, dass Sie ein wenig an Genauigkeit verlieren, aber je nachdem, wie genau f
beibehalten werden soll, wäre dies die beste Lösung.
Hier ist ein Union-Ansatz, der separate Namen für Integer-Teile anstelle von einem Array gibt:
%Vor% Ich war anfangs besorgt, dass diese Verwendung von union
gemäß dem Standard nicht streng legal ist: C ++ Undefiniertes Verhalten bei Unionen , aber das Argument von ComicSansMS in einem Kommentar zu rashmatashs Antwort ist überzeugend.
Zunächst sollten Sie beachten, dass der Standard für float
keine spezifischen Größenbeschränkungen vorschreibt. Es ist möglich, dass ein float
bei einer vorstellbaren Architektur nicht in vier Bytes passt (obwohl mir das nicht bekannt ist). Sie sollten mindestens (static_) bestätigen, dass es passt, bevor Sie etwas versuchen.
Dann denke ich, dass der einfachste Weg darin besteht, zu bestätigen, dass CHAR_BIT
ist 8
, und benutze das legale Aliasing zu unsigned char*
mit reinterpret_cast
:
Dies ignoriert jedoch vollständig das Endian-Problem. Vielleicht möchten Sie also eine Kopie der Bytes erstellen, damit Sie das beheben können:
%Vor%Tags und Links c++ qt floating-point-conversion uint8t