c uint java_按位转换uint32_t以在C / C中浮动

我从网络接收缓冲区,该缓冲区被转换为32位字的数组 . 我有一个单词被我的界面文档定义为ieee float . 我需要从缓冲区中提取这个单词 . 在不调用转换的情况下从一种类型转换为另一种类型很困难 . 这些位已经符合ieee浮点标准,我不想重新排列任何位 .

我的第一次尝试是将 uint32_t 的地址转换为 void* ,然后将 void* 转换为 float* ,然后取消引用为 float :

float ieee_float(uint32_t f)

{

return *((float*)((void*)(&f)));

}

错误:解除引用类型惩罚指针将破坏严格别名规则[-Werror = strict-aliasing]

我的第二次尝试是这样的:

float ieee_float(uint32_t f)

{

union int_float{

uint32_t i;

float f;

} tofloat;

tofloat.i = f;

return tofloat.f;

}

然而,街上的一句话是工会完全不安全 . 从最近没有编写的联合成员读取它是未定义的行为 .

所以我尝试了更多的C方法:

float ieee_float(uint32_t f)

{

return *reinterpret_cast(&f);

}

错误:解除引用类型惩罚指针将破坏严格别名规则[-Werror = strict-aliasing]

我的下一个想法是“搞砸它 . 为什么我要处理指针呢?”并尝试过:

float ieee_float(uint32_t f)

{

return reinterpret_cast(f);

}

错误:从'uint32_t'类型无效转换为'float'类型

有没有办法在不触发警告/错误的情况下进行转换?我用 -Wall -Werror 用g编译 . 我宁愿不接触编译器设置 .

我标记了C,因为c解决方案是可以接受的 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值