【问题标题】:Cross platform definition of 64 bit integers in C++ for Windows and Linux用于 Windows 和 Linux 的 C++ 中 64 位整数的跨平台定义
【发布时间】:2013-04-09 17:41:03
【问题描述】:

我正在尝试用 C++ 为 Windows(MinGW) 和 Linux(g++) 编写跨平台代码。我习惯于在 Linux 中将 64 位整数定义为“long”,但是当我转到 MinGW 时,sizeof(long) 返回 4 个字节。然后我发现我可以在 MinGW 中使用“long long”或“__INT64”来定义 64 位整数。我有两个问题:

1.-为 Windows 和 Linux 定义 64 位整数的最便携方法是什么?我目前正在使用 #ifdef,但我不知道这是否是最好的方法这样做:

#ifdef LINUX
    #define INT64 long 
#elif WIN32
    #define INT64 long long
#endif

2.-我应该在 MinGW 中使用“long long”还是“__INT64”?为什么?

【问题讨论】:

  • 我觉得你想说的是long long 而不是double double
  • @drahnr 我的错,我编辑了帖子

标签: c++ cross-platform mingw long-integer int64


【解决方案1】:

您可以使用int64_t 类型,它在标题cstdint 中定义。这是 C++11 的标准。

请注意,如果您使用的平台不支持 64 位整数,则此类型可能不存在。

至于long long,那是另一种可能。 long longs 至少为 64 位宽。请注意,它也是 C++11 的标准,尽管在使用 C++03 时它可以在多个编译器上工作。

正如 Pete Becker 所说,您可以使用 int_least64_t。如果您不介意完全使用 64 位整数,但使用一些 至少 64 位宽的整数类型,这是一个不错的选择。

【讨论】:

  • 可能更好的选择:int_least64_t,它将永远存在。
  • 你不明白:确切的大小 typedef 是可选的,所以如果你不需要精确的位数,使用最少和快速的类型更便于移植。
【解决方案2】:

我相信如何获得 64 位整数的问题已得到充分回答,但我将尝试第二个问题,无论是使用“long long”还是“__INT64”。你需要首先回答的问题就是你需要的。如果出于某种原因您需要正好 64 位,请务必使用能够准确提供 64 位的东西,即 int64_t。即使您的平台/编译器没有 stdint.h,也请将您的 typedef 创建为合适的类型作为解决方法(#ifdef'd 用于编译器),因为它使您的代码更具自我记录性。另一方面,如果您正在处理例如大内存段(例如 DVD 映像)中的偏移量,使用 size_t 或 ssize_t,因为它们通常与指针大小相同,这也是自记录的。同样,文件中的偏移量最好使用 fpos_t 表示。

顺便说一句:“long”在 Linux 中是 64 位的假设是错误的。特别是在 32 位变体上,它是 not 64 位,我也不确定是否真的所有 64 位变体都使用 64 位长整数。这些不同的系统称为 ILP32、LP64 和 LLP64。在网络上搜索这些术语!

【讨论】:

  • 你对在 Linux 中 long 是 64 位的假设是正确的,我应该更加小心我的措辞。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多