wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将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复制到我创建的
我有一个如下结构:
struct pts_t 
{
    uint32_t lsb;
    uint32_t msb;
};@H_696_16@ 
 

我想把它变成双重的.直接写是否安全:

pts_t t; 

double timestamp = t;@H_696_16@ 
 

并且更复杂,如果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);
}@H_696_16@
最初的想法是写下面的内容
double timestamp = *( ( double * ) &( t.lsb ) );@H_696_16@ 
 

要逐步执行此操作(假设您处于32位环境中):

>您正在获取标识符t.lsb的地址,因为您需要找到结构中第一个字节的内存地址.请注意,您也可以选择.
>然后,您将该内存地址转换为指向double(8字节)的指针.
>您最后解除引用该指针并将所有8个字节存储在标识符时间戳使用的8字节内存块中.

备注:

>您需要虑小/大字节序.
>您假设结构和双精度都正确对齐(如下所述).
>这是不可移植的,你假设一个double是8个字节.

现在,备注中的三点需要担心.在多个平台上移植此代码时,这将成为一个巨大的痛苦.如下所述,使用C联合是一种更好,更正确的便携式解决方案.

C联盟将如下编写:

double timestamp = ( union { double d; struct pts_t pts; } ) { t } .d;@H_696_16@

大佬总结

以上是大佬教程为你收集整理的如何将2 uint的结构转换为double全部内容,希望文章能够帮你解决如何将2 uint的结构转换为double所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。