You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将4字节char数组内容赋值给unsigned long变量读取对应float值

解决方法

核心问题说明

  • 你现有代码的核心问题是需要把rdata数组里的4个独立字节按顺序拼接为4字节整数,同时要避免平台类型长度差异、有符号字符移位溢出的问题
  • 你给出的rdata存储顺序是小端字节序(低位字节在前,高位字节在后),刚好对应整数值0xc140a3d7

优化后实现代码

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

union sUnion {
    // 改用固定4字节的无符号整数,避免64位系统下long为8字节的问题
    uint32_t hex;
    float var;
};

void Testcode(void)
{
    // 改用unsigned char避免有符号char高位为1时溢出为负数的问题
    unsigned char rdata[4] = { 0xd7, 0xa3, 0x40, 0xc1 };
    char ctemp[100];
    union sUnion r;

    // 方法1:手动按字节序拼接(无需依赖memcpy,字节序不匹配时可自行调整移位顺序)
    r.hex = ((uint32_t)rdata[3] << 24) 
          | ((uint32_t)rdata[2] << 16) 
          | ((uint32_t)rdata[1] << 8) 
          | (uint32_t)rdata[0];

    // 方法2:直接内存拷贝(写法更简洁,前提是rdata的字节序和当前CPU字节序一致)
    // memcpy(&r.hex, rdata, 4);

    sprintf(ctemp, "hex = %x, float = %.2f", r.hex, r.var);
    // 输出结果为 hex = c140a3d7, float = -12.04
}

注意事项

  • C标准允许通过联合体做类型双关实现整数和浮点数的内存重解释,该行为是明确定义的
  • 如果rdata来源于网络、外设等外部数据源,需要先确认其字节序和当前CPU的字节序是否匹配,不匹配时要先做字节序翻转
  • 固定长度整数类型定义在stdint.h头文件中,符合C99及以上标准要求

内容的提问来源于stack exchange,提问作者tehos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:18:02