到目前为止,我了解到处理器具有寄存器,对于 32 位处理器,它们是 32 位,对于 64 位,它们是 64 位。那么有人可以解释如果我给处理器一个比它的寄存器大小更大的值会发生什么吗?计算是如何进行的?
问问题
1024 次
1 回答
4
这取决于。
为了讨论,假设 x86,64 位整数仍然可以在 32 位架构上“本地”处理。在这种情况下,程序通常使用一对 32 位寄存器来保存 64 位值。例如,该值0xDEADBEEF2B84F00D
可能存储在EDX:EAX
寄存器对中:
eax = 0x2B84F00D
edx = 0xDEADBEEF
在某些情况下,CPU 实际上需要这种格式的 64 位数字(例如IDIV)。
数学运算在多条指令中完成。例如,在 32 位 x86 CPU 上的 64 位加法是使用add
低位 DWORD 的一个,然后是adc
高位 DWORD 的一个,这会考虑第一次加法的进位标志。
对于更大的整数,使用任意精度算术(或“big int”)库。在这里,动态大小的字节数组用于表示整数,以及附加信息(如使用的位数)。 GMP是一种流行的选择。
对大整数的数学运算是迭代完成的,可能一次使用原生字长值。对于血腥的细节,我建议您查看这些开源库之一的源代码。
所有这一切的关键在于,数字运算是在可管理的部分中执行的,并结合起来产生最终结果。
于 2013-06-20T05:34:30.717 回答