【问题标题】:Unexpected output in converting from long in C to long in C++ in VS?从 C 中的 long 转换为 VS 中的 C++ 中的 long 时出现意外输出?
【发布时间】:2020-06-02 20:25:38
【问题描述】:

我正在用 C 语言编写一个程序(使用学校特定的 IDE),然后在 Visual Studio 中将其转换为 C++。 C 中的程序将 long 变量作为 371449635398431 的用户输入(使用学校 IDE 和一个名为 get_long 的独特编译器函数)在 VS 中让它变得很长。 C 中的 long 是否与 C++ 中的 long 不同(C 中的 long 等同于 C++ 中的 long long?),还是编译器不匹配会导致问题?

【问题讨论】:

  • 请刷新the help pages,采取SO tour,阅读How to Ask,以及this question checklist。最后,请edit 您的问题包含您的代码的minimal reproducible example,以及任何可能的输入以及实际和预期的输出。
  • 这在实现之间会有所不同——不同的编译器和/或不同的操作系统。标准只保证整数类型的下限,不同的实现实现不同的实际边界/大小。
  • @Jeff on most 现代 Unix 系统 long 将是 8 个字节。但在 Windows 和其他一些系统上,它确实是 4 个字节 - 就标准而言,这是完全可以的。
  • 如果您需要 64 位整数,请始终使用 int64_t

标签: c++ c visual-studio


【解决方案1】:

C 和 C++ 标准规定 long 必须具有至少 -2147483647 到 +2147483647 的范围。 (请注意,C++20 至少需要 -2147483648)。

Microsoft 的 Windows 编译器将 long 的范围设置为 -2147483648 到 +2147483647。典型的 Unix 编译器(例如 rhel 上的 gcc)具有 64 位类型的 long

在 Windows 64 位上保持 long 为 32 位类型的动机是为了向后兼容。在过去,真的很容易将 Win32 应用程序转换为 Win64 应用程序。

【讨论】:

    【解决方案2】:

    在编写第一个 C 标准时,编译器通常将“long”解释为至少 32 位的最短类型。当编译器添加对 64 位类型的支持时,“long long”通常是至少 64 位的最短类型。以这种方式处理事物意味着缺少固定长度类型并不是真正的问题,因为需要 32 位类型的代码可以在任何具有 32 位整数类型的平台上使用“long”。

    MSVC 始终遵循该约定,即使针对 64 位平台也是如此。然而,其他一些编译器已经决定改变 long 在基于微机的平台上一直具有的含义,以便 long 不是 32 位,long long 是 64 位,两者都是 64 位类型.

    注意,顺便说一句,即使在 longlong long 都是 64 位类型的平台上,它们彼此也不兼容。如果有一些函数对通过long* 标识的数据进行操作,而另一些函数对通过long long* 标识的数据进行操作,则clang 和gcc 都将假定这些指针永远不会用于访问相同的存储。

    【讨论】:

    • @Bathsheba:第一个。唯一一个没有任何类型,保证至少为 64 位。
    【解决方案3】:

    long 的大小取决于编译器、设置、数据模型和月相(最后一个原因是笑话)。但长尺寸至少是32位。

    如果你想使用精确的大小,你可以使用 int64_t。例如。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 2021-04-06
      • 2021-06-11
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多