【问题标题】:convert int[2] to long将 int[2] 转换为 long
【发布时间】:2011-04-26 15:32:19
【问题描述】:

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

源机器是 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

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

谢谢

【问题讨论】:

  • 这取决于你所说的“long intint[2] 表示”是什么意思。您是如何创建这种表示的?
  • 字节序不是唯一的问题:对于特定机器上的特定编译器,sizeof(int) 可能等于 sizeof(long)。在这种情况下,您的代码应该什么都不做。
  • 例如在 64 位 Windows 上,long 是 32 位。
  • @Steve:对于任何类型的 T,sizeof(T) 取决于编译器,而不是操作系统,因此说“64 位 Windows”是不准确的。您必须说“Windows 7 64 位下的 Microsoft Visual C++ 编译器版本 X.Y”。
  • @Kiran:但是现在您要求针对特定于平台的问题提供独立于平台的解决方案!一般来说,如果你想要独立于平台的数据类型,你应该使用<stdint.h>中的int32_tint64_t

标签: c++ int long-integer


【解决方案1】:

我在 32 位机器上有一个 long 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 为其他类型设置别名。

【讨论】:

  • 谢谢,这对我有用。我不能直接使用 int64 的原因是输入来自第三方,我无法控制它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2013-01-20
      相关资源
      最近更新 更多