【问题标题】:Different sizeof(long) values in W7 and Linux MintW7 和 Linux Mint 中不同的 sizeof(long) 值
【发布时间】:2016-04-15 15:57:22
【问题描述】:

IDE:代码::块 13.12

编译器:GNU GCC

应用类型:控制台应用

语言:C

平台:W7 和 Linux Mint

我为自定义语言编写了编译器和解释器,我为 Windows 和 Linux 制作了可执行文件。编译器 - 显然 - 生成一个由解释器读取的代码文件。我想在 Windows 和 Linux 上都使用编译后的文件。因此,使用 Windows 编译器创建的文件必须能够被 Linux 解释器读取,反之亦然。

我无法让兼容性工作。我发现在 Windows 中 sizeof(long)=4 而在 Linux 中 sizeof(long)=8。由于编译器会将长整数写入输出文件,我认为大小的差异是(部分)我遇到的问题。

我查看了这个论坛,但类似的问题大多是关于转换和编写独立于平台的 C++ 代码。我还发现了一些关于使用 (u)intptr_t 的建议,但这些也与指针有关。

也许最快的解决方案是在 Linux 中使用 int 类型而不是 long 类型,但这样两个平台的源代码就会不同。

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 你可以('t)使用固定宽度的变量吗?
  • @Marnix:这是任何二进制格式的问题。无论您碰巧在其上编译的系统上的内部表示形式如何,您都必须决定使用哪种数据格式。此外,它不仅仅是长度,还有字节顺序之类的东西,所以如果你想让你的编译文件在其他架构上工作,仅仅使用 uint64_t 是不够的。
  • 您显然通过简单的转换来序列化数据类型。那是非常错误的方式。对移位/屏蔽和固定宽度类型使用正确的序列化。

标签: c windows long-integer sizeof linux-mint


【解决方案1】:

考虑将 int32_t 用于 32 位 2 的补码有符号整数类型,将 int64_t 用于 64 位 2 的补码有符号整数类型。

请注意,编译器不必支持这些类型,但如果支持,那么它们必须如我所述。

C 中的 int 可以小到 -32767 到 +32767。 long 必须至少为 32 位。 MSVC 在 64 位系统上将 long 维护为 32 位(它使用 LLP64 模型)。 C 标准没有对尺寸设置上限。这种灵活性允许在各种平台上进行最佳 C 编译。

【讨论】:

    【解决方案2】:

    如果您想使用特定大小,请使用带有大小后缀的类型,例如 uint64_tlong 整数的大小因架构和操作系统而异。 参考链接:https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2013-06-27
      • 2013-09-24
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多