【发布时间】:2018-06-25 16:35:24
【问题描述】:
为什么 strtol() 在 C 中对非常大的数字返回 -1?
例如:
#include <stdio.h>
#include <string.h>
int main() {
long long i = strtoll("135898539853985649864867468746876587784760", NULL, 10);
printf("i = %lld\n", i);
return 0;
}
【问题讨论】:
-
对于大多数平台来说,LLONG_MAX 是 64 位
9223372036854775807签名的。这比您提供的要少得多。其次,strtol无论如何都会返回一个long,你会想要使用strtoll,它仍然不适合,但至少返回正确的类型。这个main里面有三行代码,有两行坏掉了。可能需要再次点击文本。 -
您正在打印一个
long long值,其格式为普通int。那是在误导你。它返回LONG_MAX。 -
%d是long long的错误格式说明符,导致未定义行为。将其更改为%lld。 -
@gem C 规范中没有任何内容可以防止“A long is more than 63 bits”,尽管这并不常见。
-
@GemTaylor 在这种情况下的行为应该是将读取位置移动到数字序列的末尾,但返回
LONG_MAX并将errno设置为ERANGE。
标签: c type-conversion strtol