在文件中存储32位浮点值的可移植性问题

Storing a 32 bit float in a file portability concerns

本文关键字:可移植性 问题 文件 存储 32位      更新时间:2023-10-16

如果我通过以下代码将浮点存储在文件中

fwrite((void*)(&v), sizeof(v), 1, f); // v is a float.

由于float是8个字节而不是4个字节,使用此代码读取文件的程序多久会导致运行时错误?

float v;
fread((void*)(&v), sizeof(v), 1, f);
return v;

我可以一直读取4个字节并将其转换为8个字节的浮点值吗?那会更便携吗?

强调不同的Windows平台64位与32位。

我不太担心float的大小,而更担心它的字节序。我认为绝大多数C++实现都使用IEEE 754,这意味着float总是32位和双64位。

您可能希望只序列化值的文本表示,或者特别注意确保字节顺序正确。

如果可以的话,最好将数据存储为文本,而不是原始二进制。这避免了上述问题和无数其他问题,例如:

  • endianness
  • 元素大小
  • float等人的不同格式
  • 填充/对齐
  • 不同程序版本之间的前向/后向兼容性

如果需要,它还可以让其他程序使用数据。

当然,不利的一面是文本需要更多的存储空间,所以如果你有很多数据,那么文本可能不是一个选择。

float的大小可能会更改,但double不会。你确定使用double不是更好的主意吗?double总是8个字节。

float在引用IEEE单精度浮点时非常通用,无论平台是32位还是64位。

在Windows平台上,无论是32位还是64位进程/OS,sizeof(float)始终为4字节。不知道标准,但在大多数平台上,浮点的大小是四个字节。