将int[2]转换为long

convert int[2] to long

本文关键字:转换 long int      更新时间:2023-10-16

我在32位机器上有一个长int的int[2]表示,我想把它转换成64位机器上的长int。是否有一种独立于体系结构的安全方法来进行这种转换?

源机器是32位的,int是32位的。目的机器是64位的,long long类型肯定是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

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

谢谢

我在32位机器上有一个长int型的int[2]表示,想把它转换成64位机器上的long型。是否有一种独立于体系结构的安全方法来进行这种转换?

没有。因为除了端序之外,这两种数据类型的大小也可能不同。在一些流行的平台上,intlong具有相同的大小(都是32位)

最终,这取决于您如何创建int[2]表示。无论您为创建int数组所做的是什么,都必须反转,以便从中获得有效的long

一种实际可行的方法(但从技术上讲,是未定义的行为)是将两者放在一个联合中:

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

现在您可以简单地写入u.i2并从u.l读取。c++标准在技术上不允许这样做(这是一种未定义的行为),但这是一种常见的技巧,大多数编译器都显式地支持它。

然而,更好的方法可能是使用char[]而不是int[],因为char被明确地允许别名其他类型。

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

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

宽度问题可以通过在两台机器上使用boost::uint64_t来解决。

http://www.boost.org/doc/libs/1_46_1/libs/integer/doc/html/boost_integer/cstdint.html boost_integer.cstdint.exact_width_integer_types