Qt使用第三方库GMP,用以超长整数运算

  GMP是开源的数学运算库。当Qt自带的qint64(依赖系统位数)也满足不了长度时,可以用它进行数据计算。
    最近写的下载器中,当下载到2点几G时,突然出现startPoint与endPoint变为负数,导致http的Range请求头部出错。网上一查,原来是整数溢出。如下代码:

qint64 startPoint=0;
qint64 endPoint=0;
int index=-1;
 if((index = sectionList.indexOf("-1")) != -1)
{
     if(index == (sectionList.count()-1))
      {
           startPoint = index*bufferSize;
            endPoint = totalBytesCount;
      }else
       {
            startPoint = qint64(index*bufferSize);//大到一定值,这里最先溢出
            endPoint = qint64((index+1)*bufferSize-1);
        }
     sectionList.replace(index,"0");
     thread->receiveTask(index,this->realUrl,startPoint,endPoint);
}
编译GMP:
到http://gmplib.org/官网下载源码包。
解包后进入解压目录。执行:

./configure --enable-cxx
make
make check  
sudo make install

安装完成。

Qt中使用:
pro中添加:
LIBS += -lgmpxx -lgmp
项目中的环境变量添加:
LD_LIBRARY_PATH    /usr/local/lib

基本使用 示例
#include<gmp.h>
#include<stdio.h>
char* BigMul(char* m,char* n);
void main()
{
char* p=NULL;
char *a="12345678";
char *b="23456789";
p=BigMul(a,b);
printf("the result is %s./n",p);
}
char* BigMul(char* m,char* n)
{
int i,j;
char* pt=NULL;
mpz_t s,p,q;
        mpz_init(s);
i=mpz_init_set_str(p,m,10);//get number from m
j=mpz_init_set_str(q,n,10);
//printf("i,j:%d,%d\n",i,j);
gmp_printf("%Zd\n%Zd\n",p,q);
mpz_addmul(s,p,q);//calculate result
//gmp_printf("the result is %Zd\n",s);
pt=mpz_get_str(pt,10,s);//get string from s
//printf("%s\n",pt);
mpz_clear(s);
return pt;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值