我需要将32位浮点变量(IEEE 754)分解为4个字节,以通过MODBUS将其发送出去。我需要保持与IEEE 754标准相同的按位结构,我只想将该结构切成4个字节。
我首先想到的是使用位移运算符:
*word_1_h = (uint8_t) (number>>8) & 0xFF;
*word_1_l = (uint8_t) number> & 0xFF;
*word_2_h = (uint8_t) (number>>24) & 0xFF;
*word_2_l = (uint8_t) (number>>16) & 0xFF;
但是编译器返回错误:
error: invalid operands to binary >> (have 'float' and 'int')
然后我尝试了另一种方法:
{
if(float & (1<<cnt)) 32bit_int |= (1<<cnt);
else 32bit_int &= ~(1<<cnt);
}
这也引发了错误:
error: invalid operands to binary & (have 'float' and 'int')
这是我的功能:
void MIC488_LL_float_splice(float number, uint8_t * word_1_h, uint8_t * word_1_l, uint8_t * word_2_h, uint8_t * word_2_l)
{
//Konwersja 2 rejestrów (4 bajty) na liczbę 32 bitową (DINT, DWORD, FLOAT).
//RejestrX HI <-> Bajt1
//RejestrX LO <-> Bajt0
//RejestrX+1 HI <-> Bajt3
//RejestrX+1 LO <-> Bajt2
//Liczba_32_bit = Bajt3<<24 + Bajt2<<16 + Bajt1<<8 + Bajt0
//lub Liczba_32_bit = RejestrX + Rejestr(X + 1)<<16
//uint32_t temp = 0;
/*for(uint8_t cnt=0;cnt<32;cnt++)
{
if(number & (1<<cnt)) temp |= (1<<cnt);
else temp &= ~(1<<cnt);
}*/
*word_1_h = (uint8_t) (number>>8) & 0xFF;
*word_1_l = (uint8_t) number> & 0xFF;
*word_2_h = (uint8_t) (number>>24) & 0xFF;
*word_2_l = (uint8_t) (number>>16) & 0xFF;
}
因此,结果无法将float转换为二进制变量。有什么明智的方法吗?
答案 0 :(得分:2)
类型float
本身不支持移位运算符;它们仅针对整数类型定义。
但是,您可以定义union
类型,以便将float类型和uint8_t数组放置在相同的内存位置:
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
typedef union {
float floatValue;
uint8_t bin[sizeof(float)];
} floatOrBytes_t;
int main() {
floatOrBytes_t f;
f.floatValue = 3.15;
for (size_t i = 0; i<sizeof(f.bin); i++) {
uint8_t val = f.bin[i];
printf("(%zu):%" PRIu8 "\n",i,val);
}
return 0;
}