我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
从7.22.1.4第8段(2011年版标准的N1570草案):
若正确的值是表示的值的范围之外时,
LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX,或ULLONG_MAX被返回(根据该值的返回类型和标志,如果有的话),以及宏的值ERANGE被存储在错误号.
由于输入字符串的正确值对于类型而言太大,因此您将获得LONG_MAX并errno设置为ERANGE.
每当其中一个strto(u)l(l)函数返回其中一个TYPE_MAX或多个TYPE_MIN值时,您需要检查errno以确定它是否是正确的结果,或者您的输入是否超出范围.