浮点数在内存中的存储格式

文章讨论了如何在不同大小端系统中使用union类型将浮点数转换为uint32_t,同时避免违反MISRA-C规则。提供了两种示例代码,一种是原始的但不合规的,另一种是修改后的合规版本。
摘要由CSDN通过智能技术生成

使用 union 类型方式将浮点数的二进制形式保存到 uint32_t 变量中时,需要考虑大小端的影响。

在大端系统中,浮点数的最高字节位于内存的低地址处,而在小端系统中,浮点数的最低字节位于内存的低地址处。因此,当使用 union 类型方式时,如果浮点数和 uint32_t 共用同一段内存空间,需要根据实际的系统大小端模式来确保正确的读取和保存。

以下是一个示例代码,考虑了大小端的影响:

#include <stdio.h>
#include <stdint.h>

union FloatToUint32 {
    float f;
    uint32_t u;
    uint8_t bytes[4];
};

void flt_to_int(float src, uint32_t *dst) {
    union FloatToUint32 converter;
    converter.u =  1;
    if(converter.bytes[0] == 0)
    {
        // 如果是小端系统,则将低地址处的 uint32_t 赋值给目标变量
        converter.f = src;
        *dst = converter.u;
    }
    else
    {
        // 如果是大端系统,则将高地址处的 uint32_t 赋值给目标变量
        converter.f = src;
        *dst = ((converter.u&0x000000FF)<< 24)|((converter.u&0xFF000000)>> 24)|((converter.u&0x00FF0000)>> 8)|((converter.u&0x0000FF00)<< 8);
    }
}

int main() {
    float temp = 10000.0f;
    uint32_t val;
    flt_to_int(temp, &val);
    printf("0x%08x\n", val);
    return 0;
}

示例代码违反misra-c2012-19.2建议规则。使用强转或是memcpy又会违反别的规则  :---)

以下示例可以符合MISRA。

#include <stdint.h>
#include <string.h> // 在主函数之前包含 string.h 头文件
uint32_t flt_to_int(float src);

uint32_t flt_to_int(float src)
{
    uint32_t dest = 0;
    ((unsigned char*)(&dest))[0] = ((unsigned char*)(&src))[0];
    ((unsigned char*)(&dest))[1] = ((unsigned char*)(&src))[1];
    ((unsigned char*)(&dest))[2] = ((unsigned char*)(&src))[2];
    ((unsigned char*)(&dest))[3] = ((unsigned char*)(&src))[3];
    return dest;
}
int main()
{
    float temp = 10000.0f;
    uint32_t val = flt_to_int(temp);
    printf("%08x", val);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值