【问题标题】:C++ Long Long INT - 64-bits does this limit use to 64-bit OS only?C++ Long Long INT - 64 位此限制是否仅用于 64 位操作系统?
【发布时间】:2023-04-07 07:03:01
【问题描述】:

使用 64 位的 C++ Long Long int 是否会限制使用该程序仅在 64 位操作系统上执行,还是在 32 位操作系统上执行时仍会处理 64 位值?

我有一个程序,我将整数种子传递给随机生成器,并使用种子作为随机算法中起始位置的键。我用 long long int 编译了我的代码,它编译并运行没有问题,但是我的系统运行的是 Windows 7 64 位,我没有 32 位系统来测试它。虽然这个程序将主要在我的 64 位系统上运行,但这个问题背后的原因是要了解 long long int 使用是否仅适用于 64 位 OS 系统,或者 32 位系统是否可以通过说 2 处理 64 位 int或更多时钟周期来处理 64 位,而 64 位操作系统能够在更少的时钟周期内处理它等?也许我将苹果与橙子与 64 位 int 与 64 位 CPU/OS 进行比较?认为如果能够由 32 位 CPU/OS 处理,它可能在 64 位 int 上效率低下?

【问题讨论】:

  • 请分享程序以便更好地理解
  • 有助于了解如何在 32 位环境中实现 64 位类型和操作:stackoverflow.com/a/20773254/2805305
  • 查看en.cppreference.com/w/cpp/types/integer 当您需要一个必须足够大以处理特定位数的变量时,最好使用那些“编号”的 int 类型。当您只需要一个整数时,您应该使用“普通”int 类型,但在这种情况下您可以做出的唯一假设是 sizeof(int)
  • 它基于此源,但 IF 逻辑已被彻底纠正为仅利用 ASCII 调用而不是为要从数组调用的字符分配我自己的映射。我只是想扩大可用于影响随机生成器算法起始位置的键的范围。在序列重复之前不知道随机生成器算法的总长度,long long int 种子可能是矫枉过正? stackoverflow.com/questions/34698580/…

标签: c++


【解决方案1】:

简而言之,没有。

使用long long 类型不会限制您对操作系统的选择。如果您的编译器支持long long 并针对 32 位操作系统(甚至是 16 位操作系统),那么编译器或库会整理出如何支持更长类型的详细信息。

使用long long 类型确实会限制您使用支持这种类型的编译器(和库),无论您使用什么操作系统。在 C++ 中,2011 年标准引入了它们,但一些较旧的编译器支持 long long 类型作为扩展(例如,因为 C 自 1999 年以来就已经这样做了)。因此,早于 2011 标准的编译器可能不支持 long long 类型。

【讨论】:

    【解决方案2】:

    简答 - 否。

    术语 32 位和 64 位是指计算机处理器处理信息的方式。 64 位版本的 Windows 比 32 位系统更有效地处理大量随机存取内存 (RAM)。
    如果你有一个 long long int,它只是意味着它在内存中占用了 64 位。

    请参阅What is the difference between a 32-bit and 64-bit processor?,全面了解 32 位和 64 位处理器之间的区别。

    也看看 - https://en.wikipedia.org/wiki/64-bit_computing

    【讨论】:

      【解决方案3】:

      内存中的整数大小与 CPU 使用的位数无关。 但是 int 的长度可能会有所不同,因为该处理器总是尝试以最有效的方式运行,因此对于 32 位处理器,int 的默认大小为 32 位。 使用 long long int 或 uint64(64 位无符号整数)等类型将保证所有处理器的 64 位长度。所以最好记住这一点。

      【讨论】:

        【解决方案4】:

        您担心您的程序在 32 位机器上运行时是否会以同样的方式运行。你不应该。

        如果它被编译为 32 位应用程序,它将始终以相同的方式运行,只是不会使用 64 位处理器的功能。因此,您可能已经猜到 long long 可以使用 32 位编译器,否则您将无法构建您的程序。

        如果编译为 64 位应用程序,则根本无法在 32 位机器上运行。

        【讨论】:

        • 所以如果我使用的是 32 位 IDE 并在 64 位操作系统上运行,那么 32 位的 IDE 决定了用它编译的内容总是与 32 位兼容?
        • @DaveL IDE 无关紧要。当你编译一个程序时,你指定你想要它是 32 位还是 64 位。当从您指定 at 作为参数的命令行运行编译器时,IDE 将在项目设置中有一个选项。总是有一些默认设置,具体取决于编译器。 Visual Studio IDE 是 32 位的,但您可以使用它编译 32 位和 64 位程序。
        • 非常感谢您澄清这一点。 =) 我正在使用 Bloodshed Dev C++ 4.9.9.2,当我回到家时,我将不得不四处寻找选项。
        • 只是对我过去关于 Bloodshed Dev C++ 4.9.9.2 的帖子的编辑,看起来至少有 350 个我不知道的错误,所以我在网上找到了对 Orwell Dev-C++ 的参考作为从原始项目产生的叉子,作为转移到的建议。我多年来一直在使用 Bloodshed Dev-C++。在我读到一篇关于它缺乏 C++11 并且 Orwell Dev-C++ 支持它的文章之前,我从未考虑过切换到更新版本。在此之前,我多年来一直在使用 Borland C++ 5.02,这是我多年前买的一本书(1998 @Waldenbooks)的背面,2007 年改用 Dev C++。=)
        【解决方案5】:

        不,相反,它完全取决于操作系统使用的数据模型和正在使用的编译器。在 C++ 中,自 C99 以来,long long int 的大小为 64 位。事实上,大多数 Linux/Unix 实现都将 long 定义为 64 位类型,但在 Windows 中它只有 32 位,因为它们使用不同的数据模型。查看与模型相关的给定64 bit computing

        【讨论】:

          【解决方案6】:

          编辑:long long int 始终存在于 C++11 实现中,并且它至少有 64 位,因为 5.2.4.2.1(不是 C++ 标准)中的 C 标准 需要它(通过定义 LLONG_MAX 的最小值)。这意味着你应该没事。但在 32 位系统上,该库可能很慢或不可用。

          【讨论】:

            【解决方案7】:

            long long int 不保证是 64 位整数。至少不符合 C++ 标准:

            3.9.1 基本类型 [basic.fundamental]

             ...
            

            2 有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在这份名单中, 每种类型提供的存储空间至少与它之前的存储空间一样多 名单。也可能有实现定义的扩展签名 整数类型。标准和扩展的有符号整数类型是 统称为有符号整数类型。普通整数具有自然的 执行环境架构建议的大小; 提供其他有符号整数类型以满足特殊需要。

            换句话说,您拥有的唯一保证是long long int 至少与long int 一样大。就是这样。

            现在,在大多数现代执行环境中,long long int 是一个 64 位值,即使在本机 32 位硬件平台上也是如此。

            但是,就 C++ 标准而言,您没有任何保证。因此,您可能会发现在特定的 32 位平台上,long intlong long int 都是 32 位整数值。这将完全符合 C++ 标准。

            【讨论】:

            • long long int 的大小必须至少为 64 位。
            • 你的理由是什么? C++ 标准在这一点上似乎很清楚。
            • 一些最小的谷歌搜索提供了许多来源,其中一些引用了标准:stackoverflow.com/questions/589575/…en.cppreference.com/w/cpp/language/typesen.wikipedia.org/wiki/C_data_types
            • std:numeric_limits<long long int>::min()(在 C 中又称为 LLONG_MINlong long int 的实现定义值)要求为 -9223372036854775807 或更少,而 std:numeric_limits<long long int>::max()(又名 LLONG_MAX)为必须是9223372036854775807 或更多。所有基本整数类型(charint、...long long 等)的一个基本属性是能够唯一地表示最小值和最大值之间的所有值。没有 32 位类型可以唯一地表示 -92233720368547758079223372036854775807 之间的所有值。
            • 刚刚在用 IF 语句测试输入以避免 IF 溢出时发现了一个奇怪的问题 (seed1'9223372036854775807'){ //要求用户在其中输入一个数字范围。} 似乎我无法获得任何长度大于 10 位的数字,因为 11 位或更大位长度的任何数字都被标记为好像超过 9223372036854775807 (长度为 19 位)。也许它是 Bloodshed Dev C++ 4.9.9.2 的问题,它可能是 350 多个错误之一,也可能是由其他原因引起的。我不会以任何方式投射 long long int 以使其失去 max val
            猜你喜欢
            • 1970-01-01
            • 2013-08-01
            • 2017-02-08
            • 2013-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-11
            • 2023-04-01
            相关资源
            最近更新 更多