Typecast跨平台兼容性

时间:2010-05-16 05:36:20

标签: c++ portability

我要做的是将二进制整数附加到字符串对象中。到目前为止,我有这个:

int number = 5;
cppstring.append((char*)&number, 4);

它在带有Windows的x86系统上运行良好,但是有些人说它不是跨平台的并且不安全。这样做的首选方法是什么?

2 个答案:

答案 0 :(得分:3)

它不可移植的原因是int不总是4个字节。例如,ILP64数据模型使用8字节的整数。 C99只要求int至少为2个字节。为什么需要这样做,如果int的大小不是4个字节,那么期望的行为是什么?

答案 1 :(得分:1)

总是 通常可以正常工作,无论你在哪个平台,如果通过工作你只是意味着“不崩溃”。 编辑我错过了size的{​​{1}}参数,所以它实际上可能会崩溃或产生奇怪的结果,因为string::append不是4的平台上的缓冲区下溢字节长。

但是,您可能会根据运行代码的平台的整数大小和endianness观察到不同的结果,如果您要将在平台上创建的文件共享到错误另一个运行相同程序的平台。

这取决于您的期望。 Windows(通常)在具有32位整数的little-endian计算机上运行,​​这意味着您的代码会将int附加到您的字符串。但是,在同样具有32位整数的big-endian台机器上,您的代码会将05 00 00 00附加到字符串。更糟糕的是,您的代码可以在具有16位大端整数的平台上运行,这些整数将附加00 00 00 05

根据您想要的行为,最好实现一种“不太神奇”的方式来附加字节,例如知道要追加的00 05循环以小端方式的4个字节:

for

这样,您可以确保结果在不同平台上保持一致,因为代码既不依赖于整数的大小,也不依赖于字节顺序。