目录
要将一个 32 位的 float
数据拆分为两个 16 位的数据,需要将 32 位的 float
拆解成 4 个 8 位字节,然后分别合并成 16 位的数据。
过程
- 将
float
类型的 32 位数据转换为 4 个 8 位字节(uint8_t
)。 - 将这 4 个字节按顺序组合成两个 16 位的数据(
uint16_t
)。
示例代码
#include <stdio.h>
#include <stdint.h>
void splitFloatTo16Bit(float value, uint16_t* high, uint16_t* low) {
// 将 float 转为 4 个字节(uint8_t)
uint8_t* bytePtr = (uint8_t*)&value;
// 高 16 位由前两个字节组成
*high = (uint16_t)(bytePtr[0] << 8 | bytePtr[1]);
// 低 16 位由后两个字节组成
*low = (uint16_t)(bytePtr[2] << 8 | bytePtr[3]);
}
int main() {
float myFloat = 3.14159f; // 示例 float 数据
uint16_t high, low;
// 拆分 float 数据为两个 16 位数据
splitFloatTo16Bit(myFloat, &high, &low);
// 输出拆分结果
printf("High 16 bits: 0x%04X\n", high);
printf("Low 16 bits: 0x%04X\n", low);
return 0;
}
解释:
-
uint8_t* bytePtr = (uint8_t*)&value;
通过类型转换将float
类型的数据视为字节数组(uint8_t*
),这样可以逐字节访问它的内容。 -
*high = (uint16_t)(bytePtr[0] << 8 | bytePtr[1]);
将前两个字节(高字节和次高字节)拼接成一个16
位数(high
)。 -
*low = (uint16_t)(bytePtr[2] << 8 | bytePtr[3]);
将后两个字节(低字节和次低字节)拼接成另一个16
位数(low
)。
示例输出:
假设 myFloat = 3.14159
(即 0x40490fdb
的 32 位表示),输出的 high
和 low
将会是:
High 16 bits: 0x4049
Low 16 bits: 0x0FDB
数据传输
通过此方式,可以将一个 32 位的 float
拆分成两个 16 位的数据,每个数据可以作为一个包独立传输。接收端可以将这两个 16 位的数据重新组合回原始的 float
数据。