假设我知道我的号码可能有多少位数(并且我想第一次分配适当的空间量,我如何计算我需要分配的字节数?我想我可以总是将值设置为1*10^(num digits)
,然后设置为0
,但感觉不对,就像我打败目的一样。
为了清楚起见编辑:我想知道我需要多少字节来存储一个带有n
十进制数字的整数,以及MPIRs实现是否会影响它。 @JonathonLeffler在评论中给出了正确答案。
答案 0 :(得分:3)
由于存在MPIR标记,这可能是MPIR,GMP的一个分支。在当前文档(仅限PDF - 无在线HTML)中,在“初始化整数”标题下,您可以找到:
void mpz_init2(mpz_t integer, mp_bitcnt_t n)
初始化
integer
,有空间n
位,并将其值设置为0。n
只是最初的空间,integer
如有必要,将以正常方式自动增长 用于存储的后续值。mpz_init2
如果a,可以避免这种重新分配 最大尺寸是事先知道的。
如果是GMP,您可以阅读Initializing integers上的在线手册,找到:
- 功能:
void mpz_init2(mpz_t x, mp_bitcnt_t n)
初始化
x
,空格为n
- 位数,并将其值设置为0.永远不需要调用此函数而不是mpz_init
或mpz_inits
;需要时,GMP会自动处理重新分配。虽然
n
定义了初始空间,但如果需要,x
会以正常方式自动增长,以便存储后续值。如果事先知道最大大小,mpz_init2
可以避免这种重新分配。在准备手术时,GMP通常会分配比最终需要更多的肢体。要确保GMP不会对
x
执行重新分配,您需要将mp_limb_t中的位数添加到n
。
两者基本相同。