为什么指针变量没有显示100位数?

目标:我有精度要求我需要显示100位数字或至少50位数

尝试1:首先我使用整数变量然后它只显示10位数

尝试2:在我朋友的帮助下,我使用了指针概念,它成功地输入了50到100位,但指针变量只显示10位数

我写的程序是

#include  #include  main() { int *p; p=(int*)malloc(100*sizeof(int)); *p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890; printf("%d",*p); } 

在执行上述程序时,我得到了垃圾值

提前致谢

您需要使用bignum (任意精度大数字)库,因为native intlong具有受C实现限制的精度 – 即硬件(通常为32或64位;另请参见 header和int32_tint64_t类型)。 我建议使用GMPlib ; 你需要精通C才能使用这些库。 阅读GMLib的文档 。

不要试图自己编码bignumber算法。 你会使用效率低下的算法。 用于bignums的高效算法难以理解和发明。 你仍然可以获得博士学位。 所以使用一些现有的 bignum库。

因此,您可以编写类似以下内容的代码,将您的bignum乘以137并打印结果

 mpz_t bign; mpz_t bigr; // initialize bign from a literal string mpz_init_set_str (bign, "12345678901234567890123456789012345678901234567890" "12345678901234567890123456789012345678901234567890", 10); // initialize bigr mpz_init(bigr); /// compute bigr = bign * 137 (137 is a long, not a bignum) mpz_mul_si(bigr, bign, 137L); /// print bigr on stdout in base 10 mpz_out_str (stdout, 10, bigr); /// clear all the numbers mpz_clear(bign); mpz_clear(bigr); 

在安装了GMP的Linux系统上,您可以使用以下命令编译此类代码(在yoursource.c ):

 gcc -Wall -Wextra -g yoursource.c -lgmp -o yourprog 

在其他系统上,您可能需要一些gcc -I-L参数。 调试程序后,请让编译器使用-O2对其进行优化

请注意,某些语言(Common Lisp,Scheme,Python)具有内置的bignums。

顺便说一下,你的mainfunction定义不正确 。 它应该被定义为int main(int argc, char**argv)

要回答第一部分,单个有signed integer (假设为32位)可以取-2,147,483,648和+2,147,483,647之间的值

这是你的十位数的来源。

根据您的编译器,您可能0..18,446,744,073,709,551,615 unsigned long long可用(64位),但仍然只提供最大值或0..18,446,744,073,709,551,615 (20位)

处理100位数字将需要一些jiggery-pokery!

 int * p = malloc(100*sizeof(int)); 

为100 int的数组分配内存。

 *p= .... 

实际上是一样的

 p[0]=... 

所以这

 *p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890; 

分配给一个int

int可能不会超过32位(在某些平台上更少)。 最大的32位(正)整数是2147483647

C是一种接近硬件的语言。 因此,您需要了解其数据类型的存储function和限制。

PC上的int只能存储32位或64位值,具体取决于您的硬件和操作系统版本。

是的,您可以实现处理更大值的例程,并使用链接的数字列表是一种方法。

您不能将这么长的数字存储在int变量或指向int类型的指针中。

如果int是32位,则范围是[-2147483647,+ 2147483647]。 C数据类型

要存储大值,可以使用char指针并使用字符串常量对其进行初始化。

例如:


 #include  #include  main() { char *p = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; printf("%s\n",p); }