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

标签 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]。

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

Buff = *(float*)&aux;

在第二种情况下,“Buff”上不会出现任何内容

  • Buff 是一个 float

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

最佳答案

2个问题:

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

  2. 两个 Actor :(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

关于c - 将字节重新解释为 C 中的 float (IEEE 754 单精度二进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48068467/

相关文章:

c++ - 当我似乎包含正确的标题时,找不到符号错误

javascript - 使用浮点值制作 math.random

python - numpy.reciprocal 在重复调用时返回不同的值

python - 如何在Python中读取解释后的数据字符串?

Java 从 int 到 byte 可能出现的有损转换错误

python - 为什么 python 的结构认为 little-endian 和 big-endian 意味着不同的长度?

c - 数组的动态数组

java - 如何将 C 变量 (JNI) 存储到 Java 类实例

c - 为什么在输入大于 9 x 的值后无法输入更多输入?

c - iphone:如果 float 为负数,则转换为无符号整数的 float 将设置为 0?