我正在尝试使用%d
的{{1}}格式修饰符读取任意大小的整数。当输入整数具有10个或更少的数字时,此操作将按预期执行。但是,当我尝试输入一个11位或更多位数的数字时,scanf()
表现得很奇怪。它似乎返回负值。例如,在读取scanf("%d", &number)
时,分配的值12345678901
也为number
。
有没有人知道为什么会这样?也许-539222987
读取的整数大小有限制?
谢谢!
答案 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