如何将2 uint的结构转换为double

我有一个如下结构:
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);
}
最初的想法是写下面的内容
double 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;

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...