strtol和strtoul有什么区别?

use*_*903 6 c std strtol

strtol在c中遇到了一些无法解释的结果

这是示例程序.

#include <string.h>
#include <stdio.h>    
#include <stdlib.h>

int main()
{
    printf("%x\n", strtol("0xfffff70A", NULL, 0));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个简单程序的输出是

0x7fffffff
Run Code Online (Sandbox Code Playgroud)

而不是0xfffff70A.如果我使用strtoul,结果是完全正确的0xfffff70a.我使用的是32位机器,我想知道会发生什么.PS.我正在使用gcc 4.7.2

Dan*_*her 5

从7.22.1.4第8段(2011年版标准的N1570草案):

若正确的值是表示的值的范围之外时,LONG_MIN,LONG_MAX,LLONG_MIN, LLONG_MAX,ULONG_MAX,或ULLONG_MAX被返回(根据该值的返回类型和标志,如果有的话),以及宏的值ERANGE被存储在错误号.

由于输入字符串的正确值对于类型而言太大,因此您将获得LONG_MAXerrno设置为ERANGE.

每当其中一个strto(u)l(l)函数返回其中一个TYPE_MAX或多个TYPE_MIN值时,您需要检查errno以确定它是否是正确的结果,或者您的输入是否超出范围.

  • 该死的,我只是*即将粘贴相同的.:-D @PascalCuoq:即使在溢出的情况下,`strto ...`函数的行为也非常明确.这就是使它们优于例如用于解析数字输入的`*scanf()`函数的原因. (3认同)