将ull转换为mpz_t

我看到问题mpz_t的post到无符号长时间转换(gmp lib)和Chris Jester-Young给了我答案

mpz_t ull2mpz(unsigned long long ull) { char buf[40]; int len; mpz_t result; len = snprintf(buf, sizeof buf, "%llx"); if (len >= sizeof buf) { /* oops */ } mpz_init(result); len = gmp_sscanf(buf, "%Zx", result); if (len != 1) { /* oops */ } return result; } 

这里的问题是, 如何将GMP C参数约定转换为更自然的东西? mpz_t是一个数组。 我怎样才能避免这种情况(不做那么奇怪的事情,只返回一个值)? 如果我写的话

 void mpz_set_ull(mpz_t val, unsigned long long ull){ char buf[40]; int len; mpz_t result; len = snprintf(buf, sizeof buf, "%llx"); if (len >= sizeof buf) { /* oops */ } mpz_init(result); len = gmp_sscanf(buf, "%Zx", result); if (len != 1) { /* oops */ } mpz_set(val,result); } 

我的结果错了。

而且,他的代码是合法的C吗?

OP没有正确使用snprintf() 。 需要通过ull

使用

 char buf[sizeof(ull)*CHAR_BIT/3 + 2]; // let the sizeof `buf` be sized per `ull` needs ... snprintf(buf, sizeof buf, "%llx", ull); // Add missing `ull`