C中的并集-将浮点数视为字节数组

时间:2019-03-01 07:36:55

标签: c

我已设置并集读取32位浮点值,即32.0800018310(二进制= 100000.0001010001111011)。

现在,我想使用12字节(每字节8位)的整数数组显示浮点数的内容。

但是我得到以下输出:

Display:
236 
81 
0 
66 

不应该

  • data_to_send[0]返回浮点数的前8位,即01111011(十进制= 123)
  • data_to_send[1]返回浮点数的后8位,即00010100(十进制= 20)
  • data_to_send[2]返回浮点数的后8位,即100000。(十进制= 32)
  • data_to_send[3]返回浮点数的后8位,即0。(十进制= 0)

数字.会怎样?您如何显示?

union
{
  uint8_t  data_to_send[12];
  float    float_value;
} union_var;

union_var.float_value =  32.0800018310 

//display array
 USB.print("Display: ");
USB.printf("%d \n", union_var.data_to_send[0]);
USB.printf("%d \n", union_var.data_to_send[1]);
USB.printf("%d \n", union_var.data_to_send[2]);
USB.printf("%d \n", union_var.data_to_send[3]);

4 个答案:

答案 0 :(得分:3)

float值的存储方式取决于计算机的体系结构。

如今,它们几乎总是以IEEE 754格式存储,这与您的想象完全不同。

答案 1 :(得分:1)

标准C中的浮点表示形式被分解为3组:正负号,尾数和指数。 Here可以看到如何打印,一点一点地阅读它以及有关C标准实现的浮点的其他信息。

答案 2 :(得分:0)

如何存储它取决于您的系统细节。但通常最高有效位是符号,然后8位指数偏移127,然后是21个尾数表示要求和的分数。

#include <stdio.h>
#include <stdint.h>

void main(void){

    int i;
    union
    {
        uint8_t  data_to_send[12];
        float    float_value;
    } union_var;

    union_var.float_value =  32.0800018310;

    unsigned char sign = 43 + ((union_var.data_to_send[3] >> 7) << 1);

    int exponent = ((union_var.data_to_send[3] & 0x7F) << 1) + (union_var.data_to_send[2] >> 7) - 127;

    int mantissa_store = (union_var.data_to_send[2] & 0x7F << 16) + (union_var.data_to_send[1] << 8) + union_var.data_to_send[0];

    double mantissa = 1.0; 
    double part = 0.5;
    for (i=22;i>=0;i--) 
    {
        if (mantissa_store & (1<<i))
        {
            mantissa += part;
        }
        part /= 2;
    }

    printf("Float is: %c 2^%d * %.12f\n",sign,exponent, mantissa);
    printf("Mantissa value: %d\n",mantissa_store);
}

输出:

Float is: + 2^5 * 1.002500057220
Mantissa value: 20972

答案 3 :(得分:0)

  

浮点值为32.0800018310(二进制= 100000.0001010001111011)。

您将“定点数”表示法与“浮点数”表示法混淆。

数字32.0800018310确实具有二进制表示形式00000000.0100000.00010100.01111011 如果存储为缩放因子为2 ^ 16的定点数字

也就是说:

2^16 is 65536

00000000.0100000.00010100.01111011 as normal binary number is  2102395

and

2102395 / 65536 is 32.0800018310

因此,作为比例因子为2 ^ 16的定点数,您的二进制表示形式是正确的,但是...

计算机不会将浮点存储为定点数。常见的方法是使用IEEE 754格式。

因此,当您以二进制格式打印浮动时,您将看到IEEE 754的二进制表示形式,而不是您期望的值。

定点格式不是C标准的一部分,但是如果您想使用定点数学运算,可以从网上下载许多C定点库。