我在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条答案
按热度按时间wmomyfyw1#
来自7.22.1.4第8段(共the N1570 draft of the 2011 edition of the standard段):
如果正确的值超出可表示值的范围,则返回
LONG_MIN
、LONG_MAX
、LLONG_MIN
、LLONG_MAX
、ULONG_MAX
或ULLONG_MAX
(根据返回类型和值的符号,如果有),并且宏ERANGE
的值存储在errno中。因为输入字符串的正确值对于该类型来说太大,所以得到
LONG_MAX
,而errno
被设置为ERANGE
。每当
strto(u)l(l)
函数返回TYPE_MAX
或TYPE_MIN
值之一时,您需要检查errno
以确定它是正确的结果,还是您的输入超出了范围。m1m5dgzv2#
您正在运行
long
类型的溢出,该类型是带符号的。您可能应该用途:
相反,请注意“u”表示“无符号”(请参见manual page)。
另外请注意,您不能使用普通的
%x
打印unsigned long
,您需要将其限定为大于int
。gfttwv5a3#
您的体系结构具有32位
long
类型。0xfffff70A
不能表示为带符号的32位long
。errno
应设置为ERANGE
。在2的补码中,32位有符号整数的可表示值范围为
-0x80000000
到0x7fffffff
。