加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 01:48:06 所属栏目:Windows 来源:网络整理
导读:我有一个如下结构: struct pts_t { uint32_t lsb; uint32_t msb;}; 我想把它变成双重的.直接写是否安全: pts_t t; double timestamp = t; 并且更复杂,如果struct类型是C dll API的一部分,没有“packing”属性(对于所有编译器)在这种情况下我必须复制pts_t
我有一个如下结构:
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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读