【问题标题】:Will a long-integer work on a 32 bit system?长整数可以在 32 位系统上工作吗?
【发布时间】:2014-03-12 20:50:01
【问题描述】:

如果我理解正确的话,一个 int 变量可以保存为 32 位,将其限制在 -20 亿到 20 亿之间。但是,如果我使用长变量,它将保存为 64 位,从而可以存储更多的数字。我使用的是 64 位系统,但是如果我以 64 位存储数据,我的代码在 32 位系统上运行良好吗?

谢谢!

【问题讨论】:

  • 它与32位或64位系统无关,它只是数据的长度。如果您需要更大的范围,请使用更多位
  • @Alexei 仔细阅读 Q。 Asker 知道 int 是 32 位,long 是 64 位。

标签: c# long-integer


【解决方案1】:

你不用担心这个。 long 值将存储在 2 个内存地址中。 Int64/long 将始终为 64 位,Int32/int 将始终为 32 位。

有一些影响(关于内存空间和性能),但最明显的可能是写/读操作在 32 位系统上不是原子的,但无论如何你不应该期望它们是原子的,因为c# 规范没有做出这样的保证。

无论哪种方式,重点是:这不是您应该担心的事情 - CLR 将这些事情抽象出来。使用最适合您的类型。

【讨论】:

  • 缺乏原子性并不是唯一的含义。性能也受到影响。和一个空间命中。
  • 好的,谢谢!然后我会更有信心地继续我对编码的基本理解!
  • @DavidHeffernan 感谢您指出这一点,我已经改写了那句话。
  • 这句话似乎也与所问的问题无关:长值将存储在2个内存地址中。 Int64/long 永远是 64bit,Int32/int 永远是 32bit。 提问者已经知道了。
  • @DavidHeffernan 提问者担心 int64 可能无法在 32 位系统上工作。这意味着他们认为所有整数都存储在一个单词中。答案表明它可以正常工作,它正常工作的原因是它将 int 存储在多个单词中。这是高度相关的。
【解决方案2】:

在 32 位系统上,对 32 位整数的操作可以在单个机器寄存器中执行。但是对 64 位整数的操作需要两个机器寄存器,并且比 32 位操作效率低很多。当然,作为大小的两倍,long 使用的内存比int 更多。如果你有这些类型的数组,那么如果你使用long,你的缓存消耗速度会提高一倍。这也会对性能产生影响。

所以,如果你可以使用int,你应该更喜欢它而不是long。但是,如果 int 提供的 32 位范围不足以保证程序的正确性,则需要使用 long

当然,尽管 64 位整数的操作在 32 位机器上执行时效率较低,但只有分析才能告诉您它是否真的重要。

也许底线是程序员不应该肆意挥霍。如果 32 位就足够了,为什么要使用 64 位?

【讨论】:

    【解决方案3】:

    是的。两者都支持数据类型。但是 64 位整数并不是 32 位处理器所固有的。如果您使用 64 位类型,并且仅针对 64 位进行编译(您可以选择 x64 或 x86 (=32bit) 作为目标),那么编译器可能会使用特定的 64 位指令,从而使您的应用程序运行得更快一些。理论上,也就是说,在实践中你可能不会注意到这一点。

    权衡是该应用程序不会在 32 位平台上运行。反过来也行。因此,如果您打算同时针对这两个平台,则需要仅编译为 32 位,或者编译两次,每个平台一次。

    long 类型的可用性无关紧要。您可以随时使用它。

    【讨论】:

    • @GolezTrol 在 .net 上,有 AnyCPU,你编译一次,抖动使 x86 或 x64 可执行
    • @DavidHeffernan 我知道。您可以选择它以及我提到的两个选项。选择 AnyCPU 是一个简单的选择,但只有当您有任何依赖项也支持这两个平台时,您才能这样做。如果其中一个是为 x86 或 x64 显式编译的,那么选择“任何 CPU”会给你带来麻烦。
    【解决方案4】:

    你可以这样尝试:

    Console.WriteLine(sizeof(long));
    

    然后将其编译为x86 而不是AnyCPU 并运行它。您也可以在 64 位 Windows 上运行 32 位程序 - 看看结果如何。

    还有更大的数字类型,例如 BigInteger,它们也适用于 32 位和 64 位操作系统。

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2018-03-03
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多