我在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
答案 0 :(得分:5)
从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
的值存储在错误号。
由于输入字符串的正确值对于类型而言太大,因此您获得LONG_MAX
,并且errno
设置为ERANGE
。
每当strto(u)l(l)
个函数之一返回TYPE_MAX
或TYPE_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位long
。 errno
应设置为ERANGE
。
在2的补码中,32位有符号整数的可表示值范围从-0x80000000
到0x7fffffff
。