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

前端之家收集整理的这篇文章主要介绍了如何将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;
原文链接:https://www.f2er.com/windows/363313.html

猜你在找的Windows相关文章