我有以下代码,我有一个数组。我向该数组添加了一个大数字,但是在打印时,它会显示一个较小的,不正确的值。为什么会这样,有没有办法解决这个问题?
int x[10];
x[0] = 252121521121;
printf(" %i " , x[0]); //prints short wrong value
答案 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 int
与int
- 良好的标准化相同 - 因此您需要转到long long int
。如果您能找到typedef,那就更好了在您的图书馆中,例如int64_t
。)
答案 2 :(得分:1)
如果您只对此特定号码有疑问,请按照之前的答案建议使用long long int
。
否则,对于更大的数字(对于有符号数字>1E19
),您可能希望切换到大量库或自己编码这种数据类型。您基本上需要将数字的每个数字存储在一个数组(或链接列表)中,并手动编写您需要的基本操作:加,减,乘等。
有些图书馆包括 https://mattmccutchen.net/bigint/ 或GMP。
答案 3 :(得分:0)
好吧,你的号码似乎超过了32位整数可以容纳的最大值..