【问题标题】:Reinterpret bytes as float in C (IEEE 754 single-precision binary)将字节重新解释为 C 中的浮点数(IEEE 754 单精度二进制)
【发布时间】:2018-01-02 22:04:01
【问题描述】:

我想在 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

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

【问题讨论】:

  • 您尚未撤消原始(可疑)转换。
  • aux[] isint[4]; 并且代码正在使用它来convert BYTE to FLOAT??
  • 这是XY problem?吗?
  • aux 应该是char[4]uint8_t[4]
  • 这些转换都没有有用的东西——我怀疑你实际上确实有一些有意义的转换,但我无法从这个问题中破译它。那么你到底想完成什么?

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


【解决方案1】:

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);
    }
    

输出

a4 70 9d 3f
1.23000002e+00

【讨论】:

  • 我正在使用一个不允许使用 printf 功能的微控制器,您是否有另一种方法来进行转换(字节到浮点数)?
  • @Guilherme 即使没有printf("%.8e\n", x.f);,转换后的float 也在x.f 中。 printf("%.8e\n", x.f); 仅用于显示目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多