如何将“ float”变量分解为四个字节?

时间:2019-07-12 08:17:39

标签: 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;
*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转换为二进制变量。有什么明智的方法吗?

1 个答案:

答案 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;
}