使用GMP库运行C ++程序以使用大数字会导致错误:C4146:一元减运算符应用于无符号类型,结果仍为无符号

问题描述 投票:0回答:1

我正在尝试将此库用于大素数程序。

我已经安装了GMP并设置了编译器:Microsoft Visual Studio Community 2019

我只是试图生成质数:

#include <gmp.h>
int main() {
    gmp_randstate_t state;  // variable state for gmp_randinit, must be initialized 
    mpz_t p, q, N;
    mp_bitcnt_t n;  // number of bits for the number in range 0 to (2^n)-1, inclusive.

    n = 10;
    gmp_randinit_default(state);    // Initialize state with a default algorithm.

    while (true)
    {
        mpz_urandomb(p, state, n);  // Generate a uniformly distributed random integer
        if (mpz_probab_prime_p(p, 50) == 2) // Determine whether p is prime. Return 2 if p is definitely prime
            break;
    }
    while (true)
    {
        mpz_urandomb(q, state, n);  // Generate a uniformly distributed random integer
        if (mpz_probab_prime_p(q, 50) == 2) // Determine whether q is prime. Return 2 if q is definitely prime
            break;
    }

    return 0;
}

[当我尝试通过Visual Studio运行时,出现错误:

C4146: unary minus operator applied to unsigned type, result still unsigned 

在文件gmp.h2230

[当我尝试通过WSL 2运行时,Ubuntu具有以下内容:

g++ filename.cpp -lgmpxx -lgmp

./a.out

我得到此输出:Segmentation fault

我不明白为什么会这样。

谢谢。

c++ gmp
1个回答
3
投票

C4146警告只是Microsoft的胡扯。查找它以了解它,然后忽略它。完全正确的程序可以发出此警告。

代码中的真正错误(以及导致序列错误的原因是,使用GMP mpz_t变量必须在使用前初始化(使用后销毁)。

mpz_t p, q, N;
mpz_init(p);
mpz_init(q);
mpz_init(N);

...

mpz_clear(p);
mpz_clear(q);
mpz_clear(N);

GMP是C库,而不是C ++库,因此需要这种手动初始化。

GMP手册非常好,您应该看一下。

© www.soinside.com 2019 - 2024. All rights reserved.