32位处理器如何支持64位整数?

时间:2014-04-13 02:29:05

标签: c++ integer

在C ++中,您可以使用int,通常为4个字节。 long long整数通常为8个字节。如果cpu是32位,是不是将它限制为32位数?为什么我不能使用long long整数,如果它不支持64位? alu可以添加更大的整数或其他东西吗?

5 个答案:

答案 0 :(得分:16)

大多数处理器都包含进位标志和溢出标志,以支持对多字整数的操作。进位标志用于无符号数学运算,溢出标志用于有符号数学运算。

例如,在x86上你可以添加两个无符号的64位数字(我们假设它们在EDX:EAX和EBX:ECX中),如下所示:

add eax, ecx  ; this does an add, ignoring the carry flag
adc edx, ebx  ; this adds the carry flag along with the numbers
; sum in edx:eax

可以在C ++这样的高级语言中实现这类功能,但是它们支持它的功能要少得多,因此代码通常比写入代码时要慢很多用汇编语言。

大多数操作基本上都是串行的。当您在二进制级别进行加法时,您需要两个输入位并产生一个结果位和一个进位。然后,在添加下一个最低有效位时,进位位用作输入,依此类推(称为"纹波加法器",因为添加"涟漪"跨越字)。

有一些更复杂的添加方法,当特定的添加不会产生依赖性时,可以减少一位与另一位之间的依赖关系,而大多数当前的硬件都使用这种方式。

然而,在最坏的情况下,将1添加到已经是给定字大小支持的最大数字的数字将导致从每个位到下一个位生成进位,一直到字。

这意味着(至少在某种程度上)CPU支持的字宽度限制了它可以运行的最大时钟速度。如果有人想要足够严重,他们可以构建一个与1024位操作数一起使用的CPU。但是,如果他们这样做,他们有两个选择:要么以较低的时钟速度运行,要么采用多个时钟来添加一对操作数。

另请注意,当你扩展这样的操作数时,你需要更多的存储空间(例如,更大的缓存)来存储尽可能多的操作数,更多的门来执行每个单独的操作,等等。

因此,如果使用相同的技术,您可以拥有一个运行速度为4 GHz的64位处理器,例如4兆字节的缓存,或者运行速度大约为250 MHz且可能具有2兆字节的1024位处理器缓存。

如果你的大多数工作都在1024位(或更大)的操作数上,那么后者可能会胜出。尽管如此,大多数人都不会经常在1024位操作数上进行数学运算。事实上,64位数字足以满足大多数用途。因此,在大多数情况下,支持更广泛的操作数可能会成为大多数人的净损失。

答案 1 :(得分:4)

即使底层硬件仅直接支持较少的位,也可以支持任意宽的整数(通过软件实现)。如果将32位整数添加到另一个32位整数,它可能会溢出并需要33位来存储答案。软件可以检测到发生了这种溢出(处理器有carry flag可以检查),另一个代表64位数字最高有效位的32位字可以递增1。

Here's a little more关于进位标志及其使用方式。

答案 2 :(得分:4)

基本上,通常单指令添加分为两个(或三个)步骤:

1)使用通常的add指令添加低32位。注意这个添加是否会产生"执行" bit(即,如果结果实际上需要33位来表示)。

2)以相同的方式添加高位32位。如果从低位开始有进位,则在此处设置进位(或者,在添加后将结果加1)。

答案 3 :(得分:3)

您使用两个内存位置来存储该号码。数字的一半存储在内存中的一个位置,另一半存储在相邻的内存位置。

答案 4 :(得分:1)

您可能还会考虑在8位CPU的时代我们曾经处理过16位甚至32位大小的整数。没有什么能限制任何特定的alu处理除内存空间之外的任意大小数字,最终我认为用户有耐心。

例如,Smalltalk总是提供任意长度的整数,因为最初的Dorados和Altos - 将我们带回到1970年。想要963的确切值! - 去做就对了。它需要一段时间才能将其格式化以进行打印。