【问题标题】:Difference between 4-byte types in 32-bit and 64-bit Linux machines32 位和 64 位 Linux 机器中 4 字节类型的区别
【发布时间】:2015-05-31 01:54:53
【问题描述】:

我正在将我们的 Linux C++ 项目从 32 位移植到 64 位。

在我们的 32 位系统中,“long”是 4 字节长。但是当我们以 64 位模式构建项目时,我们注意到“long”占用了 8 个字节。由于我们需要 4 字节长类型,我们使用“int”并确认它确实是 4 字节长。我们希望我们的代码能够无缝运行。

但不幸的是,即使 32 位模式中的“long”和 64 位模式中的“int”都是 4 字节长,我们的代码也失败了。

如果 32 位模式下的“long”和 64 位模式下的“int”有区别(布局或其他方面),有人可以告诉我们吗?即使两者都是 4 字节长?

  • 机器:Linux x86_64
  • 操作系统:CentOS 6.6
  • GCC:4.9.2

【问题讨论】:

  • 我不确定你的问题,但你有什么理由不能使用fixed width types
  • 您遇到了什么样的故障?
  • 我们也试过了。我们需要一个 64 位模式下的 4 字节长类型,我们尝试了 uint32_t。无论底层模式如何(32 位与 64 位),我们的代码都需要 4 字节类型。但不幸的是,同样的代码块失败得很厉害。该代码中没有其他内容,只有一些按位运算符,并且该代码在 32 位模式下完美运行。
  • 按位移位操作失败并在 64 位模式下返回不正确的结果(具有 4 字节长的“uint32_t”和“int”)。
  • 回答您帖子中的问题。不,您的代码中某处存在错误。

标签: c++ linux 64-bit size porting


【解决方案1】:

看看这个 - Size guarantees in C++。内置类型(int、long 等)满足一些最小大小,但它们不需要在每个系统上都是 4 个字节。您可以使用固定宽度类型(如 dwcanillas 的评论中所述)。

【讨论】:

    【解决方案2】:

    如果您需要特定字节长度的数据类型,请查看 cstdint 中的 int32_tuint32_t .

    类型保证是给定的长度,有符号和无符号。

    【讨论】:

      【解决方案3】:

      谢谢大家。问题是我们代码的本地/特定问题,我们假设指针总是 4 字节长。当我们取消引用它们时,我们将它们转换为 4 字节变量并且正在失去精度。这导致了崩溃。由于这是许多人多年来开发的大型代码库,因此有很多带有这些假设的遗留代码,我不得不检查所有指针并修改它们。最后,我们成功地将代码移植到了 64 位模式。

      【讨论】:

      • 我很感兴趣。指针在普通int 中的存储位置和频率是多少?因为我在我自己的几个项目中到处这样做(尽管主要是两个指针的区别)
      猜你喜欢
      • 2011-09-13
      • 2019-04-15
      • 2014-02-05
      • 2019-05-20
      • 2015-06-14
      • 2011-09-21
      • 2015-06-20
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多