在 C++ 中,您可以使用通常为 4 个字节的 int
。 long 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 位数字对于大多数用途来说已经足够大了。因此,在大多数情况下,支持更广泛的操作对象可能会成为大多数人的净损失。
关于c++ - 32 位处理器如何支持 64 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038451/