strtol和strtoul有什么区别?

时间:2013-05-23 10:24:39

标签: c std strtol

我在c

中遇到了strtol的一些未解除的结果

以下是示例程序。

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

int main()
{
    printf("%x\n", strtol("0xfffff70A", NULL, 0));
    return 0;
}

这个简单程序的输出是

0x7fffffff

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

3 个答案:

答案 0 :(得分:5)

从7.22.1.4第8段(the N1570 draft of the 2011 edition of the standard):

  

如果正确的值超出了可表示值的范围,LONG_MINLONG_MAXLLONG_MIN,   返回LLONG_MAXULONG_MAXULLONG_MAX(根据值的返回类型和符号,如果有的话),并且宏ERANGE的值存储在错误号。

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

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

答案 1 :(得分:1)

您正在遇到已签名的long类型的溢出。

您可能应该使用:

print("%lx\n", strtoul("0xfffff70a", NULL, 0));
                    ^
                    |
                 important!

相反,请注意“u”代表“unsigned”(请参阅​​manual page)。

另请注意,您无法使用普通unsigned long打印%x,您需要将其限定为大于int

答案 2 :(得分:0)

您的体系结构具有32位long类型。 0xfffff70A无法表示为带符号的32位longerrno应设置为ERANGE

在2的补码中,32位有符号整数的可表示值范围从-0x800000000x7fffffff