Sie schreiben: Das
struct pts_t
{
uint32_t lsb;
uint32_t msb;
};
:
pts_t t;
double timestamp = t;
ist perfekt "sicher", in dem Sinne, dass es nicht kompiliert werden, so kann es nicht schaden. Sie haben keinen Typ pts_t
definiert; Sie haben einen Typ struct pts_t
definiert.
Dies:
struct pts_t t;
double timestamp = t;
auch nicht kompiliert werden, da Sie nicht (entweder explizit, mit einer Besetzung, oder implizit, mit einer Zuordnung) umwandeln können einen Wert eines Strukturtypen auf ein Objekt numerischer Typ
Ich schlage vor, dass Sie etwas Zeit gespart hätten, wenn Sie das vor dem Posten versucht hätten.
Wahrscheinlich der einfachste Ansatz ist memcpy()
zu verwenden:
#include <assert.h>
#include <string.h>
/* ... */
struct pts_t t = { some_lsb_value, some_msbZ_value };
double timestamp;
assert(sizeof t == sizeof timestamp);
memcpy(×tamp, &t, sizeof timestamp);
Durch die Verwendung von memcpy()
statt Zeiger wirft, Sie das Risiko eines falsch ausgerichteten Speicherzugriff vermeiden; Je nach System benötigt Ihre Struktur möglicherweise mehr oder weniger strenge Ausrichtung als double
.
Es gibt auch keine Garantie, dass Ihre Struktur die gleiche Größe wie eine double
hat. Die Struktur ist fast sicher 64 Bit, und double
ist wahrscheinlich 64 Bit, aber keiner ist tatsächlich garantiert, und es tut nicht weh, Ihre Annahmen explizit zu machen.
, die offen bleibt die Frage, ob die Werte, die Sie in t.lsb
und t.msb
gespeichert haben, wenn sie zusammengenommen, eine Darstellung für einen gültigen double
Wert bilden, insbesondere für den von Ihnen gewünschten Wert. Die Sprache sagt sehr wenig darüber aus, wie Fließkommatypen dargestellt werden. Insbesondere kann und kann die Endianz über verschiedene Systeme variieren. Es liegt an Ihnen, sicherzustellen, dass eine Neuinterpretation der Darstellung auf diese Weise sinnvoll ist - und Ihr Code ist wahrscheinlich nicht portabel.
'Doppelzeitstempel = (double) (* ((uint64_t *) &t));' – sgarizvi
kann Ihnen ein Beispiel nennen? –