你有:
struct pts_t
{
uint32_t lsb;
uint32_t msb;
};
这个:
pts_t t;
double timestamp = t;
完全“安全”,因为它不会编译,因此不会造成任何伤害。你还没有定义类型pts_t
;你已经定义了一个 type struct pts_t
。
这个:
struct pts_t t;
double timestamp = t;
也不会编译,因为您不能将结构类型的值转换(显式地,使用强制转换,或隐式地,使用赋值)转换为数字类型的对象。
我谦虚地建议,如果您在发布之前尝试过,您会节省一些时间。
可能最直接的方法是使用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);
通过使用memcpy()
而不是指针转换,您可以避免任何未对齐的内存访问风险;根据系统的不同,您的结构可能需要比double
.
也不能保证您的 struct 与 a 的大小相同double
。该结构几乎可以肯定是 64 位,并且可能是double
64位,但实际上都不能保证,并且明确地做出假设也没有什么坏处。
这就留下了一个问题,即您存储在t.lsb
和中的值是否t.msb
构成了有效值的表示double
,尤其是您想要的值。该语言很少说明浮点类型的表示方式。特别是,字节顺序可以并且确实在不同系统中有所不同。您需要确保以这种方式重新解释表示实际上是有意义的——并且您的代码可能是不可移植的。