在C中存储大量数字

时间:2011-09-17 12:50:20

标签: c arrays numbers

我有以下代码,我有一个数组。我向该数组添加了一个大数字,但是在打印时,它会显示一个较小的,不正确的值。为什么会这样,有没有办法解决这个问题?

int x[10];
x[0] = 252121521121;
printf(" %i " ,  x[0]);   //prints short wrong value

4 个答案:

答案 0 :(得分:5)

您的电话号码需要38位。如果您的平台int不是那么大(而且没有理由),那么这个数字就不合适了。 (事实上​​,即使是int literal应该已经触发了编译器警告,假设这是C或C ++。)

您可以始终使用保证大小的数据类型,例如int64或类似的数据类型,具体取决于您的语言和平台。这里可能不需要任意精度的库。

在C中,包括<stdint.h>并使用int64_t,或只是使用long long int,并确保从长整数文字中初始化它,例如252121521121LL。 (我可能会补充说,Long longs只是最新语言标准的正式部分。)

编辑: long long int保证至少为64位,因此它应该是一个不错的选择。)

答案 1 :(得分:1)

在大多数系统上,int是32位。这足以存储大约20亿签约,或40亿未签名。要存储更大的数字,您需要更大的int形式。 (不幸的是,在某些系统上,long intint - 良好的标准化相同 - 因此您需要转到long long int。如果您能找到typedef,那就更好了在您的图书馆中,例如int64_t。)

答案 2 :(得分:1)

如果您只对此特定号码有疑问,请按照之前的答案建议使用long long int
否则,对于更大的数字(对于有符号数字>1E19),您可能希望切换到大量库或自己编码这种数据类型。您基本上需要将数字的每个数字存储在一个数组(或链接列表)中,并手动编写您需要的基本操作:加,减,乘等。

有些图书馆包括 https://mattmccutchen.net/bigint/ 或GMP。

答案 3 :(得分:0)

好吧,你的号码似乎超过了32位整数可以容纳的最大值..