使用strtoul()将十六进制字符串转换为无符号长整型

5
我有一个简单的示例程序,它接受十六进制值作为输入,并将其转换为无符号长整型。转换完成后,我使用 printf 输出结果。
#include <stdio.h>

int main (int argc, char *argv[])
{

    unsigned long int id = 0;

    id = strtoul(argv[1], NULL, 16);
    printf("value: %lx\n", id);

    return 0;
}

问题是:使用大于31位的十六进制数字运行此程序会导致输出值完全错误。高32位全部转换为(0xf)。strtoul()不应该能够处理最多2^64个数字吗?为什么超过32位的二进制数是垃圾值?这台机器是X86_64,实际上,使用strtoull()得到的结果也是相同的。

$ ./ex 0x7fffffff
value: 7fffffff

$ ./ex 0x80000000
value: ffffffff80000000

$ ./ex 0x3cf180000000
value: ffffffff80000000

4
如果你在使用gcc编译,那么你真的需要(a)使用-Wall选项,以及(b)仔细阅读警告信息。http://ideone.com/Z1uz5R - rici
谢谢你的提示,如果没有正确的头文件,它怎么可能在较小的数字上运行呢? - tjm
2
未声明的函数被假定返回 int 类型。因此,您将获得返回值的低位部分,然后进行符号扩展并转换为 unsigned long 类型。 - rici
1个回答

5
您的解决方案在我的本地机器上正常工作。但是,我认为您需要包含以下内容:
#include <stdlib.h>

strtoul是stdlib的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接