由于我从未接受过“正规”的计算机科学教育(我在高中),所以我一直在想这个问题,所以请原谅我对这个问题的无知。
在支持标题中列出的三种整数的平台上,哪一个更好,为什么? (我知道每种int在内存中都有不同的长度,但我不确定这意味着什么或它如何影响性能,或者从开发人员的角度来看,哪一个比另一个更有优势。)
提前感谢您的帮助。
答案 0 :(得分: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可以访问的其他一些资源(例如,3GB / 4GB内存限制为32位处理器)。 80386处理器系列(以及后来的x86)处理器的标准是32位,但现在像AMD和英特尔这样的公司目前正在制造64位标准。
答案 1 :(得分:9)
要回答您的第一个问题,16位与32位与64位整数的使用取决于它所使用的上下文。因此,你说真的不能说一个人比另一个好。但是,根据情况,优选使用一个在另一个上。考虑这个例子。假设您拥有一个拥有1000万用户的数据库,并且您希望存储他们出生的那一年。如果您使用64位整数在数据库中创建一个字段,那么您已经耗尽了80兆字节的存储空间;然而,如果您使用16位字段,则只会使用20兆字节的存储空间。你可以在这里使用16位字段,因为人们出生的年份小于最大的16位数。换句话说,1980年,1990年,1991年< 65535,假设您的字段未签名。总而言之,这取决于具体情况。我希望这会有所帮助。
答案 2 :(得分:4)
一个简单的答案是使用你知道的最小的一个可能包含的值。
如果您知道可能的值被约束为小于最大长度的16位整数(例如,对应于一年中某一天的值 - 总是<= 366),那么使用它。如果您不确定(例如,数据库中可以包含任意行数的表的记录ID),请根据您的判断使用Int32或Int64。
其他可能会让您更好地了解性能优势,具体取决于您使用的编程语言,但较小的类型使用较少的内存,因此如果您不需要更大的内容,它们会“更好”使用。
仅供参考,16位整数意味着有2 ^ 16个可能的值 - 通常表示为0到65,535之间。 32位值最高可达2 ^ 32或略高于42.9亿。
此问题On 32-bit CPUs, is an 'integer' type more efficient than a 'short' type?可能会添加一些更好的信息。
答案 3 :(得分:1)
这取决于是否应优化速度或存储。如果您对速度感兴趣并且您在64位模式下运行SQL Server,那么您需要64位密钥。 64位处理器运行的64位处理器经过优化,可以使用64位数字和地址。同样,在32位模式下运行的64位处理器经过优化,可以使用32位数字和地址。例如,在64位模式下,堆栈上的所有推送和弹出都是8个字节等。此外,从缓存和内存中取出的数据再次针对64位数和地址进行了优化。以64位模式运行的处理器可能需要更多的机器周期来处理32位数字,就像处理器一样,在32位模式下运行需要更多的机器周期来处理16位数字。处理时间的增加有很多原因,但只要考虑一下内存对齐的例子:32位数字可能无法在64位整数边界上对齐,这意味着加载数字需要在将数字加载到数字后对数字进行移位和屏蔽。寄存器。至少,每次操作前必须屏蔽每个32位数。我们谈论的是至少将处理器的有效速度减半,同时在64位模式下处理32位或16位整数。
答案 4 :(得分:-2)
给新手程序员一个简单的解释。一位是 0 或 1。
将这些概念带回家的示例:
你可以用 64 位表示比用 32 位表示比用 16 位表示的整数更多的整数。因此,使用较少位的好处是可以节省机器上的空间。使用更多位的好处是可以表示更多的整数。