Strtol()和atol()不会转换大于9位的字符串

Nat*_*aly 7 c string long-integer

在处理需要将字符串转换为长数字的应用程序时,atol()和strtol()无法正确转换任何大于9位的字符串.

strtol会提示一个与字符串无关的数字,而atol会产生一个负数(溢出).

任何想法为什么会这样,我该如何解决?

Car*_*rum 8

听起来long你的系统上有一个32位的值.这意味着任何超过4,294,967,295的无符号数字将无法正确转换,且未签署的数字也不会超过2,147,483,647或低于2,147,483,648.

通常,n位表示可以表示[-2 n -1,-2 n -1 ]范围内的带符号数或[0,2 n)范围内的无符号数.

维基百科文章计算机编号格式可能是了解更多有关此行为的一个很好的起点.

你看到不同的结果的原因atol()strtol()是因为他们有不同的错误处理特性.从strtol()手册页:

strtol()函数返回转换结果,除非该值会下溢或溢出.如果发生下溢,则strtol()返回LONG_MIN.如果发生溢出,则strtol()返回LONG_MAX.在这两种情况下,errno都设置为ERANGE.

atol()手册页:

atoi()函数将指向的字符串的初始部分转换nptr为int.行为与以下相同

strtol(nptr, (char **)NULL, 10);
Run Code Online (Sandbox Code Playgroud)

除了atoi()没有检测到错误.

atol()atoll()函数的行为相同atoi(),不同之处在于它们的字符串的初始部分转化为其返回类型的longlong long.


Fre*_*Foo 6

这可能与long您平台上的a大小有关.在32位平台上,适合a的最大值long是2147483647(2 ^ 31-1),因此任何大于它的东西都不适合.使用long longstrtoll替代.