如果我通过以下代码将浮点存储在文件中
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字节。不知道标准,但在大多数平台上,浮点的大小是四个字节。