c - W7 和 Linux Mint 中不同的 sizeof(long) 值

标签 c windows long-integer sizeof linux-mint

IDE:代码:: block 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 类型,但那样的话我会为两个平台使用不同的源代码。

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

最佳答案

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

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

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

关于c - W7 和 Linux Mint 中不同的 sizeof(long) 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719889/

相关文章:

c - long long Integer 的乘法错误是什么?

c - 安全存储 AES key

c - 字符串中每 3 个字符后插入一个字符

windows - 当最小化/恢复动画打开时,如何在删除任务栏按钮之前平滑地最小化窗口?

java - 如何使用 JAVA 设置文件的通用属性,如标题、主题、评论、公司等

java - 为什么我无法计算 "long"的平方根? (婴儿程序员)

Java if语句currentTimeMillis,检查特定时间是否已经过去

c++ - 在 C/C++ 代码中查找指针是否静态等同于停止问题?

c - 在c中将内存地址作为文件传递

windows - Windows 上的 Git 不要求 SSH key 密码,或使用 SSH key