scanf("%d",& i)不会读取超过10位的数字

时间:2016-09-16 00:42:28

标签: c io

我正在尝试使用%d的{​​{1}}格式修饰符读取任意大小的整数。当输入整数具有10个或更少的数字时,此操作将按预期执行。但是,当我尝试输入一个11位或更多位数的数字时,scanf()表现得很奇怪。它似乎返回负值。例如,在读取scanf("%d", &number)时,分配的值12345678901也为number

有没有人知道为什么会这样?也许-539222987读取的整数大小有限制?

谢谢!

2 个答案:

答案 0 :(得分:6)

C的大多数情况下,int 通常 32位,只存储2147483647-2147483648之间的数字。超出限制范围的任何数字都将不受支持。

如果您想存储更长的号码,可以查看long long 一般 64位,并且可以存储在9223372036854775807-9223372036854775808之间。

您还可以输入类型unsigned,这样它就不会存储负数并将所有值分配给正确的数字。

如果要对数据类型的位数进行绝对控制,可以使用<inttypes.h>int64_t将为您提供64位signed值,而uint64_t将为您提供64位unsigned值。

您可以在<limits.h>

中查看大多数数据类型的限制

答案 1 :(得分:1)

整数类型只能存储与该类型中可用的位数一样大的数字。最大尺寸可以在<limits.h>中找到。本质上,一个任意大数字的字符串无法可靠地存储在固定大小的整数类型中。

如果您可以保证所有输入都足够小,那么使用内置的固定宽度类型就可以了。但是,如果您需要能够从字符串中读取任意大的整数,则可能需要查看存在的库以执行该任务。获得正确的任意精度表示有点复杂,因此我建议使用GMP等库,您可能希望在其中查看https://gmplib.org/manual/Formatted-Input-Strings.html#Formatted-Input-Strings