我使用gmp库编写一个类似
的C程序len = mpz_sizeinbase(res, 10);
当res = 9时,它给了我2。所以我查看了手册,上面写着
size_t mpz_sizeinbase (mpz_t op, int base)
返回给定基数中以位数表示的op的大小。 base可以从2到62不等。op的符号被忽略,仅使用绝对值。结果将是精确的或1个太大。如果以2为底的幂,则结果始终是准确的。如果op为零,则返回值始终为1。
我只想知道为什么此功能设计有这种泄漏?为什么不准确?
我发现类似的一些问题:
答案 0 :(得分:2)
mpz_sizeinbase不会查看整数,而只会查看最高的单词。然后,它估计大小。问题在于,它可能正在查看999999999或1000000000。要确切知道这两个数字中的哪一个,必须要查看数字的所有位。 mpz_sizeinbase的作用是(以单词==数字为例)计算9xxxxxxxx的大小。 xxxxxxxx部分将被忽略,并可能导致第一位溢出。因此,将大小增加一并返回。
在某些情况下,您可以分配足够的空间来快速转换号码,而浪费最少。另一种方法是将整数转换为大小,分配缓冲区,然后重新进行一次以实际存储结果。