C++ 在文件中存储32位浮点值会影响可移植性

C++ 在文件中存储32位浮点值会影响可移植性,c++,floating-point,portability,C++,Floating Point,Portability,如果我通过这个代码在文件中存储一个浮点 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位。我不太担心浮点

如果我通过这个代码在文件中存储一个浮点

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位。

我不太担心浮点的大小,而更担心浮点的持久性。我认为绝大多数C++实现使用IEEE 754,这意味着浮点总是32位和64位。
您可能希望只序列化值的文本表示形式,或者特别注意确保字节顺序正确。

浮点值的大小可能会更改,但
double
不会更改。您确定为此目的使用
double
不是更好的主意吗?双精度浮点始终为8字节。

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

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

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

  • endianness
  • 元素大小
  • float等人的不同格式
  • 填充/对齐
  • 不同程序版本之间的正向/反向兼容性
如果需要,它还可以使其他程序使用这些数据


当然,缺点是文本需要更多的存储空间,因此如果您有大量数据,则文本可能不是一个选项。

您能否提供一个浮点值不是4字节的示例?好奇的我自己我正在使用浮点来存储文件中大于整数限制(大约4gb)的偏移量。我选择float是因为我的文件不够大,不需要双偏移。如果双精度更可靠,我不介意使用双精度。@user826228,浮点不能准确地存储那么大的数字,因为它的精度实际上比32位整数低。它的范围更广,因为它使用指数。如果您需要更大的值,那么使用4G,然后使用一个8字节的int,通常称为long long或_int64。您是否意识到,使用浮点存储大于4294967295的偏移量意味着由于精度原因,无法将某些值作为偏移量?(见鬼,这同样适用于许多小于0xFFFFFF的数字。)在生活中,只需要一点点确定性。否则会很无聊。看。我只针对windows。我假设windows总是小endian。除了他们的手机软件。我的+1,这是正确的答案。您可以按标准存储IEEE浮点,但您的应用程序仍必须处理字节顺序。将浮点存储为文本的缺点是,它在两个方向上都是有损转换。在某些应用中,这是不可接受的。(当然,如果您只是在谈论存储位的十六进制表示,那么您指出的所有问题都会重新出现。)好的观点-通常您只想存储适当数量的有效位(十进制)但是如果您需要位级别的一致性,那么是的,您建议使用十六进制表示可能是一个不错的选择(尽管它会失去一点可移植性)。我不认为十六进制表示比纯二进制表示有什么好处。您仍然需要处理原始列表中的所有内容。把它放进十六进制不会改变任何事情。由于OP处理的是Windows机器,我认为在两端都支持IEE-754是合理的。十六进制具有独立于端的优点,并且没有填充、对齐等其他各种二进制问题。不过,您仍然存在表示问题。也许我们对“十六进制”的含义不同. 我在想一个十六进制表示法,它是一些浮点表示法的位。与简单的八位元流具有相同的endian问题。