首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GMP库运行C++程序会导致错误: C4146:一元减号运算符应用于无符号类型,结果仍未签名

使用GMP库运行C++程序会导致错误: C4146:一元减号运算符应用于无符号类型,结果仍未签名
EN

Stack Overflow用户
提问于 2020-03-21 19:40:27
回答 1查看 245关注 0票数 0

我试着用这个库来做一个大素数的程序。

我安装了GMP并设置了编译器:MicrosoftVisualStudioCommunity2019

我只是想生成质数:

代码语言:javascript
复制
#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运行时,我得到了一个错误:

代码语言:javascript
复制
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

我不明白这是为什么。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-21 19:51:12

C4146的警告只是微软的一派胡言。去了解它,然后忽略它。完全正确的程序可以发出此警告。

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

代码语言:javascript
复制
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手册很不错,你应该看看。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60792476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档