为什么函数 `strtoll` 给出了错误的值并将 errno 设置为 34?

Why does function `strtoll` gives a wrong value and set errno to 34?

这是我的 C 代码:

    char *ptr = "0xfff1342809062Cac";
    char *pEnd;
    long long value = strtoll(ptr, &pEnd, 0);
    printf("%lld\n", value);
    printf("errno: %d\n", errno);

我是用gcc-8.3.0编译的,输出结果是:

9223372036854775807
errno: 34

我很困惑,strtoll 给出了一个意外的值并将 errno 设置为 34。

这种行为是正确的。在您的系统上,long long 的最大值,即 LLONG_MAX9223372036854775807

您的字符串中的值大于此值;如果值超出范围且太大,则指定的行为是:return LLONG_MAX 并且 errno 设置为 ERANGE(在您的系统上大概是 34)。

或许考虑使用 strtoullunsigned long long return 值,因为该字符串适合该数据类型。