16位Int与32位Int与64位Int

art*_*ovm 17 memory int 64-bit 32-bit 16-bit

自从我从未接受过"正规"的计算机科学教育(我在高中)以来,我一直在想这个问题,所以请原谅我对这个问题的无知.

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

预先感谢您的帮助.

小智 25

"更好"是一个主观术语,但某些整数在某些平台上更具性能.

例如,在32位计算机(由32位平台和Win32等术语引用)中,CPU被优化为一次处理32位值,32指的是CPU可以消耗的位数或者在一个循环中生产.(这是一个非常简单的解释,但它得到了一般的想法).

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

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

相反,在64位平台上,16位整数需要将48位归零,32位整数需要将32位归零,并且可以立即操作64位整数.

每个平台和CPU具有"天然"位岬(如32或64),而这通常限制了一些可以由CPU访问的其他资源(例如,32位处理器的3GB/4GB存储器限制).80386处理器系列(以及后来的x86)处理器使32位成为常态,但现在像AMD和英特尔这样的公司目前正在制造64位标准.


Win*_*Oak 9

要回答第一个问题,16位与32位与64位整数的使用取决于它所使用的上下文.因此,你说真的不能说一个人比另一个好.但是,根据情况,优选使用一个在另一个上.考虑这个例子.假设您拥有一个拥有1000万用户的数据库,并且您希望存储他们出生的那一年.如果您使用64位整数在数据库中创建一个字段,那么您已经耗尽了80兆字节的存储空间; 然而,如果您使用16位字段,则只会使用20兆字节的存储空间.你可以在这里使用16位字段,因为人们出生的年份小于最大的16位数.换句话说,1980年,1990年,1991年<65535,假设你的领域是无符号的.总而言之,这取决于具体情况.我希望这有帮助.


nyc*_*dan 6

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

如果您知道可能的值被限制为小于最大长度的 16 位整数(例如对应于一年中哪一天的值 - 始终 <= 366),则使用它。如果您不确定(例如,可以有任意行数的数据库中表的记录 ID),则根据您的判断使用 Int32 或 Int64。

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

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

这个问题在 32 位 CPU 上,“整数”类型是否比“短”类型更有效?可能会添加一些更好的信息。