GMP如何以任意数量的字节存储其整数?

2 ^ 64离我的ram /硬盘驱动器可以处理的“无限”还有一段距离……

首先,我想知道GMP如何与内存/处理器一起工作,因为它做了一些阴暗的优化……

我还想知道是否有一种方法可以在任意数量的字节上存储整数(无符号,更容易)。 例如,在50个字节上,我的上限为2 ^ 400 -1。 要做的事情是使用携带以保持数字从一个字节到另一个字节保持一致,我对此有一些了解,但我真的不确定这是否是最快的方法。 我甚至不确定我是否正确。

我猜GMP使用这种方式来存储它的数据,但我只想要一些(甚至很少)解释或某些理论转发(我没有任何博士学位,所以不要太难)。

GMP动态分配空间来表示数字(并在需要增长时重新分配)。

这在Integer Internals中有详细描述,在GMP手册中 ,它描述了它如何将表示分块为“肢体”并将肢体存储在一个数组中。

术语“肢体”的描述来自GMP基础知识:命名法和类型 :

肢体是指适合单个单词的多精度数字的一部分。 (我们之所以选择这个词是因为人体的肢体类似于数字,只是更大,并且包含几个数字。)通常肢体包含32或64位。 肢体的C数据类型是mp_limb_t。

因此,在GMP中表示数字的工作原理是将多个肢体组合在一起以表示整数的大小,用符号位存储(符号位用于存储肢数)。

这对你意味着什么? 好吧,通常int64用64位表示。 完成。 如果将一堆这些包装在一起,则可以显着增加它。 将两个放在一起,2 ^ 64 * 2 ^ 64或2 ^ 128。 添加两个肢体,你得到2 ^ 256。 这是很多数字,存储在4个单词中(加上表示开销)。

当然,浮点数的表示更复杂( 参见此处 ),使用尾数(由符号和幅度组成)和指数存储表示。