C 我怎样才能分解“a”;浮动;变量转换为四个字节?
我需要将32位浮点变量(IEEE 754)分解为4个字节,通过MODBUS发送出去。我需要保持与IEEE 754标准相同的位结构,我只想将该结构切片为4字节 我的第一个想法是使用位移位运算符:C 我怎样才能分解“a”;浮动;变量转换为四个字节?,c,floating-point,binary,integer,bit-manipulation,C,Floating Point,Binary,Integer,Bit Manipulation,我需要将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; *wo
*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')
error: invalid operands to binary & (have 'float' and 'int')
然后我尝试了另一种方法:
{
if(float & (1<<cnt)) 32bit_int |= (1<<cnt);
else 32bit_int &= ~(1<<cnt);
}
这是我的职责:
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;
}
void MIC488\u LL\u float\u拼接(float number,uint8\u t*word\u 1h,uint8\u t*word\u 1l,uint8\u t*word\u 2h,uint8\u t*word\u 2l)
{
//2名雷杰斯特罗(4名巴杰蒂)纳利茨布·比托(力、德沃德、浮球)。
//RejestrX HI Bajt1
//RejestrX LO Bajt0
//RejestrX+1 HI Bajt3
//RejestrX+1 LO Bajt2
//Liczba_32_bit=Bajt3Typefloat
本身不支持位移位运算符;它们仅为整数类型定义
但是,您可以定义一个联合
-类型,以便将浮点类型和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;
}
#包括
#包括
#包括
typedef联合{
浮点数;
uint8_t bin[sizeof(float)];
}浮球细胞;
int main(){
浮球细胞;
f、 浮动值=3.15;
for(size_t i=0;iTypefloat
本身不支持位移位运算符;它们仅为整数类型定义
但是,您可以定义一个联合
-类型,以便将浮点类型和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;
}
#包括
#包括
#包括
typedef联合{
浮点数;
uint8_t bin[sizeof(float)];
}浮球细胞;
int main(){
浮球细胞;
f、 浮动值=3.15;
对于(size_t i=0;在C中,您可以使用联合。或者只需将float
值复制到char
缓冲区。您甚至可以将指向float的指针转换为指向char的指针!在C中,您可以使用联合。或者只需将float
值复制到char
缓冲区。您甚至可以将指向float的指针转换为指向char的指针!