C++:32位 vs 64位流操作

3

如果我在32位应用程序中将一个int写入fstream,然后在64位应用程序中读取该int,那么我应该期望值不同吗?如果是的话(我认为是),那么实现与体系结构无关的流操作的最佳方法是什么?


4
我们应该假设 fstream格式化的输入/输出,而不是二进制模式还是相反? - WhozCraig
在WhozCraig所说的情况下,这实际上取决于您是进行格式化(=文本)输出还是未经格式化(=二进制)输出。 - Angew is no longer proud of SO
我想推荐protobuf作为一个好的序列化系统,它是语言与平台无关的。https://code.google.com/p/protobuf/ - Omnifarious
2个回答

2
如果你使用 operator<<operator>> 进行读写操作,假设整数小到足以适应两种类型,那么它将是平台无关的,因为会被写成文本。如果您使用 ostream::readosteam::write,这将不是平台无关的,因为您将要写入二进制数据。
如果您不需要原始性能,则使用文本格式是实现平台无关性的最简单方法。 如果您需要更好的性能,请考虑使用序列化库。 Boost 有一个很好的跨平台库。

2

这取决于您是使用二进制编写还是使用ASCII编码。如果您使用ASCII(UTF-8)编写数字,则读取应产生相同的结果。

我建议您使用boost::serialization包以控制和统一的方式读写数据。

然而,反过来是否有效就不确定了,即从64位到32位。这取决于您的编译器,如果它将int编译为64位,则您可能会写入无法读入32位int的值,即使您写入格式化流中。

但是,在C ++中,int的大小没有保障,只有比short大或等于其大小。这取决于编译器。

如果您想确保,可以使用GMP处理大整数,然后自动验证数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接