我有一个如下结构:
struct pts_t { uint32_t lsb; uint32_t msb; };
我想把它变成双重的.直接写是否安全:
pts_t t; double timestamp = t;
并且更复杂,如果struct类型是C dll API的一部分,没有“packing”属性(对于所有编译器)在这种情况下我必须复制pts_t *通过API复制到我创建的pts_t实例来控制结构包装?
void f(pts_t* t) { pts_t myt; myt.lsb = t->lsb; myt.msb = t->msb; double timestamp = *(double*)(&myt.lsb); }
最初的想法是写下面的内容:
原文链接:https://www.f2er.com/windows/363313.htmldouble timestamp = *( ( double * ) &( t.lsb ) );
要逐步执行此操作(假设您处于32位环境中):
>您正在获取标识符t.lsb的地址,因为您需要找到结构中第一个字节的内存地址.请注意,您也可以选择.
>然后,您将该内存地址转换为指向double(8字节)的指针.
>您最后解除引用该指针并将所有8个字节存储在标识符时间戳使用的8字节内存块中.
备注:
>您需要考虑小/大字节序.
>您假设结构和双精度都正确对齐(如下所述).
>这是不可移植的,你假设一个double是8个字节.
现在,备注中的三点需要担心.在多个平台上移植此代码时,这将成为一个巨大的痛苦.如下所述,使用C联合是一种更好,更正确的便携式解决方案.
C联盟将如下编写:
double timestamp = ( union { double d; struct pts_t pts; } ) { t } .d;