如何将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
相关产品推荐
相关产品推荐

