C语言 strtol和strtoul有什么区别?

ylamdve6  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(204)

我在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

wmomyfyw

wmomyfyw1#

来自7.22.1.4第8段(共the N1570 draft of the 2011 edition of the standard段):
如果正确的值超出可表示值的范围,则返回LONG_MINLONG_MAXLLONG_MINLLONG_MAXULONG_MAXULLONG_MAX(根据返回类型和值的符号,如果有),并且宏ERANGE的值存储在errno中。
因为输入字符串的正确值对于该类型来说太大,所以得到LONG_MAX,而errno被设置为ERANGE
每当strto(u)l(l)函数返回TYPE_MAXTYPE_MIN值之一时,您需要检查errno以确定它是正确的结果,还是您的输入超出了范围。

m1m5dgzv

m1m5dgzv2#

您正在运行long类型的溢出,该类型是带符号的。
您可能应该用途:

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

相反,请注意“u”表示“无符号”(请参见manual page)。
另外请注意,您不能使用普通的%x打印unsigned long,您需要将其限定为大于int

gfttwv5a

gfttwv5a3#

您的体系结构具有32位long类型。0xfffff70A不能表示为带符号的32位longerrno应设置为ERANGE
在2的补码中,32位有符号整数的可表示值范围为-0x800000000x7fffffff

相关问题