我在32位机器上有一个int [2]表示long int,并希望在64位机器上将其转换为long。是否有一种安全的架构独立的方式进行这种转换?
源机器是32位,int是32位。目标机器是64位,长型机器肯定是64位。
我可以这样做吗?
long i;
int j[2];
#ifdef LITTLEENDIAN
j[1] = *(int*)(&i);
j[0] = *(((int*)(&i))+1)
#else
j[0] = *(int*)(&i);
j[1] = *(((int*)(&i))+1)
#endif
如果以上不正确,那么最好和最安全的方法是什么?我相信以前会问这个问题,但我没有找到一个干净的答案。
由于
答案 0 :(得分:4)
我在32位机器上有一个int [2]表示long int,并希望在64位机器上将其转换为long。是否有一种安全的架构独立的方式进行这种转换?
不是真的。因为除了字节序之外,两种数据类型的大小也可能不同。在某些热门平台上,int
和long
的相同大小(均为32位)
最终,这取决于您创建int[2]
表示的方式。无论你做了什么来创建int
数组都必须颠倒,以便从中获得有效的long
。
一种在实践中起作用的方法(但从技术上讲,是未定义的行为),是将两者都放在一个联盟中:
union {
int i2[2];
long l;
} u;
现在您只需写信至u.i2
并阅读u.l
即可。 C ++标准在技术上不允许这样(它是未定义的行为),但它是一个常见的技巧,主要编译器无论如何明确地支持它。
但是,更好的方法可能是使用char[]
而不是int[]
,因为明确允许char
为其他类型添加别名。
答案 1 :(得分:1)
如果您确定拥有32位整数和64位,那么您可以使用union
概念。
union Convert
{
long i;
int j[2];
};
答案 2 :(得分:0)
可以通过在两台机器上使用 boost :: uint64_t 来解决宽度问题。