c++ - 将二进制值转换为浮点值的计算器——我做错了什么?

标签 c++ endianness ieee-754

我有以下代码,它以二进制形式将 6 个 float 写入磁盘并读回:

#include <iostream>
#include <cstdio>

int main()
{
  int numSegs = 2;
  int numVars = 3;

  float * data = new float[numSegs * numVars];
  for (int i = 0; i < numVars * numSegs; ++i) {
    data[i] = i * .23;
    std::cout << data[i] << std::endl;
  }

  FILE * handle = std::fopen("./sandbox.out", "wb");

  long elementsWritten = 
    std::fwrite(data, sizeof(float), numVars*numSegs, handle);

    if (elementsWritten != numVars*numSegs){
      std::cout << "Error" << std::endl;
    }

    fclose(handle);
    handle = fopen("./sandbox.out", "rb");

    float * read = new float[numSegs * numVars];

    fseek(handle, 0, SEEK_SET);

    fread(read, sizeof(float), numSegs*numVars, handle);

    for (int i = 0; i < numVars * numSegs; ++i) {
      std::cout << read[i] << std::endl;
    }
}

输出:

0
0.23
0.46
0.69
0.92
1.15
0
0.23
0.46
0.69
0.92
1.15

当我在 hexer 中加载文件时,我们得到:

00 00 00 00 1f 85 6b 3e  1f 85 eb 3e d7 a3 30 3f
1f 85 6b 3f 33 33 93 3f  -- -- -- -- -- -- -- --

我想直接从小数计算浮点值。例如:1f 85 6b 3e 变为 0.23,1f 85 eb 3e 变为 0.46。

我在网上试过一些“二进制到 float ”的计算器。当我输入数字的十六进制表示时,0x1f856b3e,在两个计算器中我都得到 5.650511E-20 .但我认为该值应该是 0.23,因为我向计算器提供了字节 5-8,这些字节代表写入磁盘的第二个 float 。

我做错了什么?

最佳答案

这是一个 endianness例如,如果您切换问题:

1f 85 6b 3e 

到:

3e 6b 85 1f

当您使用您的转换器之一转换它时,这将导致 .23,例如我使用 IEEE 754 ConverterFloating Point to Hex Converter允许您进行 double 和单精度转换。

关于c++ - 将二进制值转换为浮点值的计算器——我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22567723/

相关文章:

c++ - 在小端机器上添加两个大端值

javascript - IEEE 754 中 Infinity 的用例是什么

javascript - IEEE 754 浮点 - 为什么它有效?

c++ - 断点当前不会被命中。没有与此行关联的可执行代码

c++ - 如何为 C++ 类设置 bool 值?

c++ - 这样的继承对性能有何影响?

c - 测试机器的字节顺序

c - Linux 中 FreeBSD 的 be64enc 和其他 dec/enc 等效函数?

c++11 - 标准 C++11 中的 IEEE 754 全序

c++ - 自动将本地比例应用于非全屏桌面连接(RDP 8.1 版及更高版本)