【问题标题】:Size of long in C++C++中long的大小
【发布时间】:2013-11-29 02:41:46
【问题描述】:

在网上搜索后,我发现(如果我错了,请纠正我)在 Windows 编译器上,int 和 long 都是 32 位长,但在大多数 Linux 编译器上,int 是 32 位,而 long 是 64 位。

如果我在 Linux 上使用 GCC 来制作 Windows 可执行文件,当我在 Windows 上运行它时,longs 仍然是 64 位长还是只有 32 位长?如果不是,我如何在所有架构/操作系统/编译器上强制 long 为 64 位长?

另外,如果我使用 32 位 GCC 或编译为 32 位架构,long 仍然是 64 位还是会变成 32 位?

【问题讨论】:

  • "Windows 编译器,整数和长整数都是 32 位长,但在大多数 Linux 编译器上,整数是 32 位,长整数是 64 位。"实际上,这取决于您使用的 Windows 编译器。 msvc 带有 32 位和 64 位编译器。尝试 64 位版本并更新您的帖子。
  • @thang 即使在 MSVC 上使用 64 位编译,long 类型也是 32 位。
  • @MarkRansom,我不明白你这么说的目的。我是否说过 64 位 MSVC 使用 64 位长字节?我一定是错过了什么......
  • @thang,是的,这正是我以为你在说的。即使现在重新阅读它,我也不知道如何以不同的方式解释它。您似乎说 MSVC 中 long 的大小取决于您是在进行 32 位还是 64 位构建。
  • @MarkRansom,重新阅读它...你能找到我所说的确切陈述吗?我从来没有说过 long 的大小。

标签: c++


【解决方案1】:

C++11 定义了fixed width integers,您可以通过包含<cstdint> 来使用它。例如,您可以使用int32_t,而不是使用int 或long。 C99 的<stdint.h> 中也有类似的功能。

如果这些都不是一个选项,您可以通过执行类似的操作来创建自己的标题。

#ifdef PLATFORM1
typedef int myint64
...
#endif
#ifdef PLATFORM2
typedef long myint64
...
#endif

然后在平台1的makefile中,传入-DPLATFORM1,在平台2的makefile中,传入-DPLATFORM2

【讨论】:

  • 如果我使用普通的 long 并使用 GCC 编译,使得 long 在编译时是 64 位,在 Windows 计算机上运行时它仍然是 64 位吗?
  • 不,linux到windows的交叉编译器也会长期使用32位
猜你喜欢
  • 2019-12-12
  • 2015-11-01
  • 1970-01-01
  • 2013-09-25
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多