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



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

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

例如,在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的1024位处理器,也许有2兆字节的高速缓存。

如果您的大部分工作都在1024位(或更大)操作数上,则后者可能是一个胜利。不过,大多数人根本不经常对1024位操作数进行数学运算。事实上,64位数字对于大多数目的来说已经足够大了。因此,在大多数情况下,支持更宽的操作数可能会对大多数人造成净损失。

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

1) 使用通常的加法指令将低位32位相加。注意这个加法是否会生成一个"进位"位(也就是说,如果结果实际上需要33位来表示)。

2) 以相同的方式添加高阶32位。如果低阶位有进位,请在此处设置进位位(或者,在相加后向结果加一)。

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

以下是关于进位旗及其使用方法的更多信息。

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

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

例如,Smalltalk自最初的Dorados和Altos以来一直提供任意长度的整数,这让我们回到了1970年。想要963的确切价值!-就这么做吧。不过要格式化才能打印还需要一段时间。

相关内容

  • 没有找到相关文章

最新更新