【问题标题】:16 bit Int vs 32 bit Int vs 64 bit Int16 位 Int 与 32 位 Int 与 64 位 Int
【发布时间】:2011-08-14 07:41:18
【问题描述】:

我一直在想这个问题,因为我从来没有接受过“正规”的计算机科学教育(我在读高中),所以请原谅我对这个问题的无知。

在支持标题中列出的三种整数类型的平台上,哪一种更好,为什么? (我知道每种 int 在内存中都有不同的长度,但我不确定这意味着什么或它如何影响性能,或者从开发人员的角度来看,哪一种比另一种更具优势)。

提前感谢您的帮助。

【问题讨论】:

  • 您应该阅读 Charles Petzold 的书“CODE”。
  • @DourHighArch 感谢您的推荐。我是一名商科学生,我真的需要知道这一点,因为我对低级编程很感兴趣。

标签: memory 64-bit int 32-bit 16-bit


【解决方案1】:

为新手程序员提供一个简单的解释。位是 0 或 1。

  • a 16 位 Int 是由 16 位(16 个 0 和 1)组成的字符串表示的整数
  • a 32 位 Int 是由 32 位(32 个 0 和 1)组成的字符串表示的整数
  • a 64 位 Int 是由 64 位(64 个 0 和 1)组成的字符串表示的整数

将这些概念带回家的示例:

  • 16 位 整数的示例是 0000000000000110,它等于 int 6
  • 32 位 整数的示例是 00000000000000000100001000100110,它等于 int 16934。
  • 64 位 整数的示例是 0000100010000000010000100010011000000000000000000100001000100110,它等于 int 612562280298594854。

你可以用 64 位表示比 32 位比 16 位更多的整数。因此,使用更少位的好处是可以节省机器空间。使用更多位的好处是可以表示更多整数。

【讨论】:

    【解决方案2】:

    一个简单的答案是使用你知道的最小的,对于它所包含的可能值的范围是安全的。

    如果您知道可能的值被限制为小于最大长度的 16 位整数(例如,对应于一年中的哪一天的值 - 始终

    其他可能会让您更好地了解性能优势,具体取决于您使用的编程语言,但较小的类型使用的内存较少,因此如果您不需要更大的类型,则“更好”使用。

    仅供参考,16 位整数意味着有 2^16 个可能的值 - 通常表示为 0 到 65,535 之间。 32 位值的范围从 0 到 2^32 - 1,即超过 42.9 亿个值。

    这个问题On 32-bit CPUs, is an 'integer' type more efficient than a 'short' type?可能会增加一些更好的信息。

    【讨论】:

      【解决方案3】:

      这取决于是否应该优化速度或存储。如果您对速度感兴趣并且您在 64 位模式下运行 SQL Server,那么您需要 64 位密钥。以 64 位模式运行的 64 位处理器经过优化以使用 64 位数字和地址。同样,在 32 位模式下运行的 64 位处理器被优化为使用 32 位数字和地址。例如,在 64 位模式下,所有入栈和出栈都是 8 个字节等。此外,从缓存和内存中获取也再次针对 64 位数字和地址进行了优化。处理器在 64 位模式下运行,可能需要更多机器周期来处理 32 位数字,就像处理器一样,在 32 位模式下运行需要更多机器周期来处理 16 位数字。处理时间的增加有很多原因,但想想内存对齐的例子:32 位数字可能不会在 64 位整数边界上对齐,这意味着加载数字需要在将数字加载到登记。至少,每个 32 位数字必须在每次操作之前进行屏蔽。我们正在谈论在 64 位模式下处理 32 或 16 位整数时至少将处理器的有效速度减半。

      【讨论】:

        【解决方案4】:

        要回答您的第一个问题,16 位、32 位和 64 位整数的使用取决于使用它的上下文。因此,你真的不能说一个比另一个更好,每个人说。但是,根据情况,最好使用一个。考虑这个例子。假设您有一个拥有 1000 万用户的数据库,并且您想要存储他们出生的年份。如果您在数据库中使用 64 位整数创建一个字段,那么您已经耗尽了 80 兆字节的存储空间;而如果您使用 16 位字段,则只有 20 兆字节的存储空间会被使用。您可以在此处使用 16 位字段,因为人们出生的年份小于最大的 16 位数字。换句话说 1980, 1990, 1991

        【讨论】:

        • 数据库空间使用量取决于数据库,对于Oracle来说不是这样,只会使用表达数字所需的字节数。
        【解决方案5】:

        “更好”是一个主观术语,但某些整数在某些平台上性能更高。

        例如,在 32 位计算机中(通过 32 位平台和 Win32 等术语引用),CPU 被优化为一次处理一个 32 位值,而 32 是指处理器的位数CPU 可以在一个周期内消耗或生产。 (这是一个非常简单的解释,但它传达了大意)。

        在 64 位计算机中(最新的 AMD 和 Intel 处理器都属于这一类),CPU 经过优化,可以一次处理 64 位值。

        因此,在 32 位平台上,加载到 32 位地址的 16 位整数需要将 16 位清零,以便 CPU 可以对其进行操作;一个 32 位整数无需任何更改即可立即使用,并且一个 64 位整数需要在两个或更多 CPU 周期内进行操作(一次用于低 32 位,然后再次用于高 32 位) .

        相反,在 64 位平台上,16 位整数需要将 48 位归零,32 位整数需要将 32 位归零,并且可以立即对 64 位整数进行运算。

        每个平台和 CPU 都有一个“本机”位数(例如 32 或 64),这通常会限制该 C​​PU 可以访问的一些其他资源(例如,3GB/4GB 内存限制为 32位处理器)。 80386 处理器系列(以及后来的 x86)处理器使 32 位成为标准,但现在像 AMD 和英特尔这样的公司目前正在使 64 位成为标准。

        【讨论】:

        • 为了完整起见,您应该添加明显的内容并提及不同的最小值和最大值。您还说位需要清零,这是否意味着在 32 位系统上使用 16 位整数比使用 32 位整数慢?
        • 那么,使用比原生字长小的整数是否会对性能产生负面影响?还是只是不比原生字长快?
        猜你喜欢
        • 2015-08-03
        • 1970-01-01
        • 2011-01-31
        • 2013-08-01
        • 1970-01-01
        • 2010-10-31
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多