GMP库使用mpz_set赋值超大整数出现警告,求正确赋值方法
GMP超大整数赋值问题解答
问题本质
你用mpz_set(c, 101511210056003611542252000)出现警告是因为这个超大整数字面量超出了C语言原生整数类型的范围。C编译器无法将这么大的数识别为合法的整数常量,所以会抛出警告甚至错误,这种写法是不被允许的。
正确赋值方法
给mpz_t类型赋值超大整数,推荐用GMP提供的mpz_set_str函数,它专门处理字符串形式的大数字,完全适配GMP的高精度类型:
mpz_t c; mpz_init(c); // 第三个参数10表示十进制,若要处理其他进制可修改该值 mpz_set_str(c, "101511210056003611542252000", 10);
为什么mpz_scan("%Zd", c)能正常运行
mpz_scan的工作逻辑是从输入流读取字符串形式的数字,然后内部完成字符串到GMP大整数的转换,相当于绕过了直接使用超大整数字面量的限制,所以不会触发编译器的类型范围警告。
内容的提问来源于stack exchange,提问作者Qasim
相关产品推荐
相关产品推荐

