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

use*_*725 9 c++ integer

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

Jer*_*fin 17

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

例如,在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
Run Code Online (Sandbox Code Playgroud)

也可以在更高级别的语言(如C++)中实现此类功能,但是它们支持它的功能要少得多,因此代码通常比使用汇编语言编写时要慢得多.

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

有一些更复杂的添加方法,当特定的添加不产生依赖性时,可以减少一位与另一位之间的依赖性,并且大多数当前硬件使用这样的东西.

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

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

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

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

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

  • @ user3452725他们可以,你只需告诉他们 - 通过链接这些携带指令. (3认同)
  • @ user3452725:添加基本上是一个串行操作 - 添加两个最低有效位会产生一个结果位*和*一个进位位,在添加下一个最低有效位时用作输入.有一些优化可以减少这种依赖性,但在最坏的情况下,你可以一直携带,所以这是不可避免的.因此,虽然他们可以在单个操作中支持更宽的单词,但这样做会降低速度,并且大多数人不经常使用128位或256位数字.类似的考虑适用于减法,乘法等. (3认同)

Ste*_*eve 5

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

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


Dre*_*all 5

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

1) 使用通常的加法指令将低位 32 位相加。请注意此加法是否会生成“进位”位(即,结果是否实际上需要 33 位来表示)。

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