Masz:
struct pts_t
{
uint32_t lsb;
uint32_t msb;
};
następująco:
pts_t t;
double timestamp = t;
jest idealnie "bezpieczne", w tym sensie, że nie będzie skompilować więc nie może wyrządzić żadnej szkody. Nie zdefiniowałeś typu pts_t
; zdefiniowałeś typ struct pts_t
.
to:
struct pts_t t;
double timestamp = t;
nie będzie również skompilować, ponieważ nie można przekonwertować (jawnie, z obsadą, lub pośrednio, z cesją) wartość typu struct do obiektu typ numeryczny.
Pokornie sugeruję, że zaoszczędziłbyś trochę czasu, gdybyś spróbował tego przed wysłaniem.
Prawdopodobnie Najprostszym sposobem jest użycie memcpy()
:
#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);
Korzystając memcpy()
raczej niż wskaźnik odlewy, można uniknąć jakiegokolwiek ryzyka braku wyrównania dostępu do pamięci; w zależności od systemu struktura może wymagać mniej lub bardziej ścisłego dopasowania niż double
.
Nie ma również gwarancji, że struktura ma taki sam rozmiar jak double
. Struktura jest prawie na pewno 64 bitów, a double
jest prawdopodobnie 64 bitów, ale żadna z nich nie jest faktycznie gwarantowana i nie zaszkodzi, aby twoje założenia były jednoznaczne.
To pozostawia otwartą kwestię, czy wartości zapisane w t.lsb
i t.msb
, razem wzięte, stanowią reprezentację dla ważnej wartości double
, szczególnie dla żądanej wartości. Język mówi bardzo niewiele o tym, jak reprezentowane są typy zmiennoprzecinkowe. W szczególności endianość może i jest różna w różnych systemach. Od Ciebie zależy, czy reinterpretacja reprezentacji w ten sposób ma sens - a Twój kod prawdopodobnie nie będzie przenośny.
'double timestamp = (podwójnie) (* ((uint64_t *) &t));' – sgarizvi
można podać przykład? –