gpt4 book ai didi

c - strtol() 和 atol() 不转换大于 9 位的字符串

转载 作者:太空狗 更新时间:2023-10-29 17:07:03 33 4
gpt4 key购买 nike

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

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

知道为什么会这样吗?我该如何解决?

最佳答案

这听起来像您系统上的 long 是一个 32 位值。这意味着任何高于 4,294,967,295 的无符号数都不会正确转换,也不会正确转换高于 2,147,483,647 或低于 2,147,483,648 的有符号数。

一般来说,n 位表示可以表示范围 [-2n-1,-2n-1) 或范围 [0,2n) 内的无符号数。

维基百科文章 Computer numbering formats可能是了解有关此行为的更多信息的良好起点。

您从 atol()strtol() 中看到不同结果的原因是它们具有不同的错误处理特性。来自strtol() man page :

The strtol() function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs, strtol() returns LONG_MIN. If an overflow occurs, strtol() returns LONG_MAX. In both cases, errno is set to ERANGE.

并且来自 atol() man page :

The atoi() function converts the initial portion of the string pointed to by nptr to int. The behaviour is the same as

strtol(nptr, (char **)NULL, 10);

except that atoi() does not detect errors.

The atol() and atoll() functions behave the same as atoi(), except that they convert the initial portion of the string to their return type of long or long long.

关于c - strtol() 和 atol() 不转换大于 9 位的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972378/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com