1

假设我知道我的号码可能是多少位数(并且我想第一次分配正确的空间量,我该如何计算我需要分配的字节数?我想我总是可以将值设置为是1*10^(num digits)然后0之后,但感觉不对,就像我在打败目标一样。

为清楚起见进行编辑:我想知道存储带n十进制数字的整数需要多少字节,以及 MPIR 的实现是否会影响这一点。@JonathonLeffler 在他的回答的评论中提供了正确的答案。

4

1 回答 1

4

由于有一个 MPIR 标签,这可能是关于MPIR的,它是 GMP 的一个分支。在当前文档(仅限 PDF — 没有在线 HTML)中,在“初始化整数”标题下,您可以找到:

void mpz_init2(mpz_t integer, mp_bitcnt_t n)

Initialize integer,为 n位留出空间,并将其值设置为 0。 n 只是初始空间 integer ,如有必要,将按正常方式自动增长,以供后续存储的值使用。 mpz_init2 如果预先知道最大大小,则可以避免这种重新分配。

如果这是针对GMP的,您可以阅读有关初始化整数的在线手册以查找:

- 功能:void mpz_init2(mpz_t x, mp_bitcnt_t n)

初始化x,为n-bit 数字留出空间,并将其值设置为 0。调用此函数而不是mpz_initormpz_inits从来没有必要;GMP 会在需要时自动处理重新分配。

虽然n定义了初始空间,x但如果需要,会以正常方式自动增长,用于存储后续值。mpz_init2如果预先知道最大大小,则可以避免这种重新分配。

在为手术做准备时,GMP 通常会分配比最终需要更多的肢体。为确保 GMP 不会对 执行重新分配x,您需要将 mp_limb_t 中的位数添加到n.

两者本质上是一样的。

于 2015-01-13T00:27:51.183 回答