在文件中存储32位浮点值的可移植性问题
Storing a 32 bit float in a file portability concerns
如果我通过以下代码将浮点存储在文件中
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字节。不知道标准,但在大多数平台上,浮点的大小是四个字节。
相关文章:
- C++Union/Struct位域的实现和可移植性
- 静态库可移植性
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 朋友功能可访问性问题
- 重写类以使其更通用,以实现可移植性
- Visual Studio 2015 <=> QtCreator 5 (c++) 代码可移植性
- 通过虚拟接口类导出C 类的可移植性
- 静态函数作为类模板参数-导致可维护性问题
- 位移位可移植性
- 提高 Python 可移植性问题
- 模板函数实例化的可移植性问题
- 嵌入式C++项目 - 需要支持智能指针.可能的可移植性问题
- 文件IO中的可移植性问题
- Qt 5.0.2应用程序的可移植性问题.如何制作简约的Qt包
- 用于发现64位可移植性问题的静态代码分析工具
- 我应该使用哪个TLS库,可移植性是一个问题
- 在文件中存储32位浮点值的可移植性问题
- 如何检测难以捉摸的64位可移植性问题