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.h
行 2230
当我尝试通过 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手册不错,你应该看看
我正在尝试将此库用于大素数程序。
我安装了 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.h
行 2230
当我尝试通过 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手册不错,你应该看看