C 为什么指针变量不显示100位数字?

C 为什么指针变量不显示100位数字?,c,pointers,C,Pointers,目标:我有一个精度要求,我需要显示100位数字或至少50位数字 尝试1:首先我使用了整数变量,然后它只显示10位数字 尝试2:在我朋友的帮助下,我使用了指针概念,它成功地输入了50到100位数字,但指针变量仅显示10位数字 我写的程序是 #include <stdio.h> #include <string.h> main() { int *p; p=(int*)malloc(100*sizeof(int)); *p=123456789012

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

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

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

我写的程序是

#include <stdio.h>
#include <string.h>

main() 
 {
    int *p;
    p=(int*)malloc(100*sizeof(int));
    *p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
    printf("%d",*p); 
 }
在执行上述过程时,我得到一个垃圾值


提前感谢

您不能在int变量或指向int类型的指针中存储如此长的数字

如果int为32位,则范围为[−2147483647,+2147483647].

要存储较大的值,可以使用char指针并用字符串常量初始化它

例如:

您需要使用任意精度的大数字库,因为本机int或long的精度受C实现的限制,即硬件通常为32位或64位;另请参见标头和int32\u t和int64\u t类型。我建议使用;要使用这些库,您需要精通C语言。阅读

不要试图自己编写大数算术代码。您将使用低效的算法。针对bignum的高效算法很难理解和发明。你仍然可以在这方面获得博士学位。因此,请使用一些现有的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系统上,您可以使用以下方法在source.c中编译此类代码:

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

请注意,一些常见的Lisp、Scheme和Python语言都有内置的bignum

顺便说一句,您的主要功能定义不正确。它应该定义为int main argc,char**argv

为100 int的数组分配内存

其实是一样的

p[0]=...
那么这个

*p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
赋值给int


在某些平台上,一个int值可能不超过32位。最大的32位正整数是2147483647。

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

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


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

要回答第一部分,假设32位的单有符号整数可以取-2147483648到+2147483647之间的值

这就是你的十位数的来源

根据编译器的不同,您可能有64位的无符号long-long可用位,但这仍然只能提供最大值或0..18446744073709551615 20位


要处理100位数的数字需要一些诡计

请至少为GCC打开编译器的警告-墙。您的代码比代码行有更多的问题。include代替,并且您正在为100个int的数组保留空间,而不是为能够表示100个数字的int保留空间。您考虑过这个数字吗。2个数字表示班级/团队的规模,4个数字表示学校的规模。5位数的小村庄6位数的小城市。8位数我们说的是大写。顺便说一句,还不到10点。不,我们需要你肠道里的细菌达到1000万。获取图片虚拟位置和指针之间没有任何关系。你会发现混淆了100位数字和100个整数,你是说32位不是吗bytes@1336087感谢您的回复,但您能否建议使用哪种数据类型来存储100位数字并显示这100位数字?不要自己重新实现Bignum算法。如果你想让算法变得高效,那么这些算法就很难实现。使用一些现有的Bignum库!这个问题没有背景。它可能是一些编程教育的任务,也可能是应用程序开发过程中的需求。在后一种情况下,坚持现有测试代码的建议适用于任何非平凡的软件+1:另一种支持大整数的语言是Tcl,比如实现BCD算法,或者使用库,比如允许任意精度的数字。当然,它有自己的printf函数,因为标准函数不能处理这样的类型。
int * p = malloc(100*sizeof(int));
*p= ....
p[0]=...
*p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;