繁体   English   中英

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

[英]How does a 32 bit processor support 64 bit integers?

在C ++中,您可以使用通常为4个字节的int long long整数通常是8个字节。 如果cpu是32位,那不会将它限制为32位数吗? 如果它不支持64位,为什么我可以使用long long整数? 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且可能具有2兆字节缓存的1024位处理器。

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

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

这里有一些关于进位标志及其使用方式的更多信息。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM