vs中gmp中 error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

在我把gmp.h .lib 和.dll文件在vs2017中配置好之后,我找了段gmp代码来测试,结果会出现这个问题:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 

我的代码如下:

#include  //记得引入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, __gmp_cy;
  __gmp_cy = 0;
  do {
      __gmp_ul = *__gmp_up++;
      *__gmp_rp++ = -__gmp_ul - __gmp_cy; //这一行出错的。。。
      __gmp_cy |= __gmp_ul != 0;
  } while (--__gmp_n != 0);
  return __gmp_cy;
}

改过之后如下:

#ifdef __GMP_SHORT_LIMB
typedef int        mp_limb_t;  //这是gmp.h中第185行 改了这个
typedef int            mp_limb_signed_t;
#else
#ifdef _LONG_LONG_LIMB
typedef long long int    mp_limb_t; //改了这个
typedef long long int        mp_limb_signed_t;
#else
typedef long int    mp_limb_t; //改了这个
typedef long int        mp_limb_signed_t;
#endif
#endif
typedef unsigned long int    mp_bitcnt_t;

改好之后,再运行就可以执行出结果了,结果如图

就是执行出来2的100次方是多少 这个版本我不知道为什么上不了图 ,就酱~

希望对你们有帮助,不过我的这个也是自己瞎改的,如果不对或是还有更好的方案,求分享。

你可能感兴趣的:(gmp)