在我把gmp.h .lib 和.dll文件在vs2017中配置好之后,我找了段gmp代码来测试,结果会出现这个问题:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
我的代码如下:
#include <gmp.h> //记得引入GMP.H的头文件
#pragma warning(disable:4146) //这个是忽略4146错误的,但是好像并没有什么卵用。。。
int main(int argc, char* argv[])
{
mpz_t t; //mpz_t 为GMP内置大数类型
mpz_init(t); //大数t使用前要进行初始化,以便动态分配空间
mpz_ui_pow_ui(t, 2, 100); //GMP所有函数基本都是以mpz打头
gmp_printf("2^100=%Zd\n", t); //输出大数,大数的格式化标志为%Zd
mpz_clear(t);
mpz_t a;
mpz_init(a);
//gmp_scanf("%Zd", a);
//mpz_clear(a);
return 0;
}
出现4146错误之后,我查了很多资料,有关的解决方案虽然很多,但是。。。对我都没什么用,后来我明白了什么问题之后,我看到错误是gmp.h文件中的第2177行,这个运算中的_gmp_ul 和 _gmp_cy 都是mp_limb_t 类型的,而mp_limb_t是unsigned int 和unsigned long long int类型的,我觉得就是这个问题,所以我在gmp.h文件中把mp_limb_t的类型给改了,把unsigned去掉了
mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n)
{
mp_limb_t __gmp_ul, __g