将int [2]转换为long

时间:2011-04-26 15:32:20

标签: c++ int long-integer

我在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

如果以上不正确,那么最好和最安全的方法是什么?我相信以前会问这个问题,但我没有找到一个干净的答案。

由于

3 个答案:

答案 0 :(得分:4)

  

我在32位机器上有一个int [2]表示long int,并希望在64位机器上将其转换为long。是否有一种安全的架构独立的方式进行这种转换?

不是真的。因为除了字节序之外,两种数据类型的大小也可能不同。在某些热门平台上,intlong相同大小(均为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)