2011-04-26 154 views
2

我在32位机器上有一个long int的int [2]表示形式,并且想要在64位机器上将其转换为long。是否有一个安全的架构独立的方式来做这种转换?将int [2]转换为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 

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

由于

+2

这取决于你所说的 “一个'INT [2]''一个长int'的代表权” 的意思。你是如何创建这种表示的? – 2011-04-26 15:34:17

+1

字节顺序不是唯一的问题:对于特定机器上的特定编译器,sizeof(int)可能等于sizeof(long)。在这种情况下,你的代码应该什么都不做。 – 2011-04-26 15:36:53

+0

例如在64位Windows上,“long”是32位。 – 2011-04-26 15:38:29

回答

4

我有一个int [2]在一个32位的机一长整型的表示,并希望将其转换为长64位计算机上。是否有一个安全的架构独立的方式来做这种转换?

不是。因为除了字节排列之外,两种数据类型的大小也可能会有所不同。在一些流行的平台,intlong相同大小(32位)

归根结底,这取决于您是如何创建int[2]表示。无论您如何创建int阵列,都必须将其颠倒过来才能获得有效的long

一种方法,这将在实际工作(但是,从技术上来说,不确定的行为),是放置在两个工会:

union { 
    int i2[2]; 
    long l; 
} u; 

现在,你可以简单地写u.i2u.l读取。 C++标准在技术上不允许这样做(这是未定义的行为),但主流编译器无论如何明确支持它是一种常见的技巧。

但是,更好的方法可能是使用char[]而不是int[],因为char的显式允许使用其他类型的别名。

+0

谢谢,这对我很有用。我无法直接使用int64的原因是由于输入来自第三方,我无法控制它。 – Kiran 2011-04-26 17:14:20

1

如果您确定有32位整数和64位,那么您可以使用union概念。

union Convert 
{ 
    long i; 
    int j[2]; 
};