我看到了问题mpz_t to unsigned long long conversion (gmp lib)上的帖子,克里斯·杰斯特·杨给了我答案

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?

最佳答案

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`

关于c - 将ull转换为mpz_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18416425/

10-10 08:24