我看到问题mpz_t to unsigned long long conversion (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;
}
这里的问题是,如How to convert GMP C parameter convention into something more natural?中所述,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吗?
答案 0 :(得分:0)
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`