在C中将字节重新解释为float(IEEE 754单精度二进制)

时间:2018-01-02 22:04:01

标签: c floating-point byte code-composer single-precision

我想在C中将4字节重新解释为IEEE 754单精度二进制文件。

为了获得代表float的字节,我使用了:

num = *(uint32_t*)&MyFloatNumber;
aux[0] = num  & 0xFF;
aux[1] = (num >> 8) & 0xFF;
aux[2] = (num >> 16)  & 0xFF;
aux[3] = (num >> 24)  & 0xFF;
  • num是一个uint32_t。
  • aux []是int [4]。

要将字节重新解释为float,我正在尝试:

Buff = *(float*)&aux;

在第二种情况下,没有任何关于“Buff”的内容

  • Buff是float

在第二种情况下,我做错了什么?

1 个答案:

答案 0 :(得分:3)

2个问题:

  1. Buff = *(float*)&aux;尝试使用4 int数组的地址作为浮点数的指针。 aux[]长度可能为16个字节, IEEE 754单精度二进制 float预计为4个字节。

  2. 两个演员:(uint32_t*)(float*)调用未定义的行为以及对齐和消除锯齿问题。最好使用union

    int main(void) {
      union {
        float f;
        unsigned char uc[sizeof(float)];
      } x;
    
      // float to bytes
      x.f = 1.23f;
      printf("%x %x %x %x\n", x.uc[0], x.uc[1], x.uc[2], x.uc[3]);
    
      // bytes to float
      x.uc[0] = 0xA4;
      x.uc[1] = 0x70;
      x.uc[2] = 0x9D;
      x.uc[3] = 0x3F;
      printf("%.8e\n", x.f);
    }
    
  3. 输出

    a4 70 9d 3f
    1.23000002e+00