Run C++ program with GMP library to use big numbers cause an error: C4146: unary minus operator applied to unsigned type, result still unsigned

Run C++ program with GMP library to use big numbers cause an error: C4146: unary minus operator applied to unsigned type, result still unsigned

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

我安装了 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

我不明白这是为什么。

谢谢。

C4146 警告只是微软的一些废话。查找它以了解它,然后忽略它。完全正确的程序可以发出此警告。

您代码中的真正错误(以及 seqmentation 错误的原因)是 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手册不错,你应该看看