我有一个简单的示例程序,它接受十六进制值作为输入,并将其转换为无符号长整型。转换完成后,我使用 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