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

时间:2014-10-25 06:55:08

标签: 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=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
    printf("%d",*p); 
 }

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

提前致谢

5 个答案:

答案 0 :(得分:4)

您需要使用bignum(任意精度大数字)库,因为原生intlong具有受C实现限制的精度 - 即硬件(通常为32或64位;另请参阅<stdint.h>标题和int32_t&amp; int64_t类型。我建议使用GMPlib;你需要精通C才能使用这些库。阅读documentation of 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

在其他系统上,您可能需要-I的{​​{1}}和-L个参数。调试程序后,请让编译器使用gcc

对其进行优化

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

顺便说一下,您的-O2功能错误地定义了。它应该定义为main ...

答案 1 :(得分:3)

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

这是你的十位数的来源。

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

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

答案 2 :(得分:2)

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

如果int为32位,则范围为[-2147483647,+ 2147483647]。 C data types

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

例如:


#include <stdio.h>
#include <stdlib.h>

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

答案 3 :(得分:2)

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

为100 int的数组分配内存。

*p= ....

实际上与

相同
p[0]=...

所以这个

*p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;

分配给int

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

答案 4 :(得分:2)

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

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

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