C 我怎样才能分解“a”;浮动;变量转换为四个字节?

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

我需要将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')
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=Bajt3Type
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;
}
#包括
#包括
#包括
typedef联合{
浮点数;
uint8_t bin[sizeof(float)];
}浮球细胞;
int main(){
浮球细胞;
f、 浮动值=3.15;

for(size_t i=0;iType
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;
}
#包括
#包括
#包括
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的指针!