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

在使用GMP库进行测试时,遇到错误C4146,原因是负运算符应用到无符号类型mp_limb_t。通过修改gmp.h文件中mp_limb_t的定义,将unsigned去掉,转换为带符号类型,从而解决了问题。代码修改后能够正确执行并展示2的100次方的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我把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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值