C 将十六进制转换为十进制

C 将十六进制转换为十进制,c,C,我正在尝试使用strtol将十六进制值转换为十进制值。以前在程序中它已经被验证为有效的十六进制值,现在我正在尝试转换它,但它一直为大多数值打印“0” int convert_hexadecimal_address(char *hexadecimal) { printf("The character going in is %s\n", hexadecimal); long hex_int = strtol(hexadecimal, NULL, 10); printf("T

我正在尝试使用
strtol
将十六进制值转换为十进制值。以前在程序中它已经被验证为有效的十六进制值,现在我正在尝试转换它,但它一直为大多数值打印“0”

int convert_hexadecimal_address(char *hexadecimal) {
    printf("The character going in is %s\n", hexadecimal);
    long hex_int = strtol(hexadecimal, NULL, 10);
    printf("The long is %ld\n", hex_int);
    return hex_int;
}

此代码有什么问题?

如果需要十六进制,请说:

long hex_int = strtol(hexadecimal, NULL, 10);

最后一个参数应该是
16

如果需要十六进制,请说:

long hex_int = strtol(hexadecimal, NULL, 10);

最后一个参数应该是
16

如果需要十六进制,请说:

long hex_int = strtol(hexadecimal, NULL, 10);

最后一个参数应该是
16

如果需要十六进制,请说:

long hex_int = strtol(hexadecimal, NULL, 10);
最后一个参数应该是
16

发件人:

确定有效字符及其解释的数字基(基数)。
如果该值为0,则使用的基数由序列中的格式确定(见上文)

因此,您应该使用:

long hex_int = strtol(hexadecimal, NULL, 16);
发件人:

确定有效字符及其解释的数字基(基数)。
如果该值为0,则使用的基数由序列中的格式确定(见上文)

因此,您应该使用:

long hex_int = strtol(hexadecimal, NULL, 16);
发件人:

确定有效字符及其解释的数字基(基数)。
如果该值为0,则使用的基数由序列中的格式确定(见上文)

因此,您应该使用:

long hex_int = strtol(hexadecimal, NULL, 16);
发件人:

确定有效字符及其解释的数字基(基数)。
如果该值为0,则使用的基数由序列中的格式确定(见上文)

因此,您应该使用:

long hex_int = strtol(hexadecimal, NULL, 16);

strtol
的语法是-

long int strtol(const char *nptr, char **endptr, int base);
如果
base
为零或16,则该字符串可能包含一个“0x”前缀,并且该数字将以基数16读取;否则,除非下一个字符为“0”,否则零基数将被视为10(十进制),在这种情况下,它将被视为8(八进制)

而不是这个-

long hex_int = strtol(hexadecimal, NULL, 10);
你应该使用-

long hex_int = strtol(hexadecimal, NULL, 16);

有关更多信息,请参见-

long int strtol(const char *nptr, char **endptr, int base);
如果
base
为零或16,则该字符串可能包含一个“0x”前缀,并且该数字将以基数16读取;否则,除非下一个字符为“0”,否则零基数将被视为10(十进制),在这种情况下,它将被视为8(八进制)

而不是这个-

long hex_int = strtol(hexadecimal, NULL, 10);
你应该使用-

long hex_int = strtol(hexadecimal, NULL, 16);

有关更多信息,请参见-

long int strtol(const char *nptr, char **endptr, int base);
如果
base
为零或16,则该字符串可能包含一个“0x”前缀,并且该数字将以基数16读取;否则,除非下一个字符为“0”,否则零基数将被视为10(十进制),在这种情况下,它将被视为8(八进制)

而不是这个-

long hex_int = strtol(hexadecimal, NULL, 10);
你应该使用-

long hex_int = strtol(hexadecimal, NULL, 16);

有关更多信息,请参见-

long int strtol(const char *nptr, char **endptr, int base);
如果
base
为零或16,则该字符串可能包含一个“0x”前缀,并且该数字将以基数16读取;否则,除非下一个字符为“0”,否则零基数将被视为10(十进制),在这种情况下,它将被视为8(八进制)

而不是这个-

long hex_int = strtol(hexadecimal, NULL, 10);
你应该使用-

long hex_int = strtol(hexadecimal, NULL, 16);

有关更多信息,请参见strtol(十六进制,NULL,10)-->
strtol(十六进制,空,16)谢谢-请随意添加此答案。但是为什么,如果我转换为十进制10,它需要以16为基数?您必须指定第一个参数的基数。@user3844996您正在将字符串从以16为基数转换为带符号的长整数。整数类型不是以10为基数的,它们只是整数。您可以选择以任何方式表示整数。实际上,他们天生就是2号基地,但这并不重要;它们代表一个数字。函数需要知道如何解释您提供给它的字符串,而不是输出的格式(因为编译器已经知道
long
的格式)-->
strtol(十六进制,空,16)谢谢-请随意添加此答案。但是为什么,如果我转换为十进制10,它需要以16为基数?您必须指定第一个参数的基数。@user3844996您正在将字符串从以16为基数转换为带符号的长整数。整数类型不是以10为基数的,它们只是整数。您可以选择以任何方式表示整数。实际上,他们天生就是2号基地,但这并不重要;它们代表一个数字。函数需要知道如何解释您提供给它的字符串,而不是输出的格式(因为编译器已经知道
long
的格式)-->
strtol(十六进制,空,16)谢谢-请随意添加此答案。但是为什么,如果我转换为十进制10,它需要以16为基数?您必须指定第一个参数的基数。@user3844996您正在将字符串从以16为基数转换为带符号的长整数。整数类型不是以10为基数的,它们只是整数。您可以选择以任何方式表示整数。实际上,他们天生就是2号基地,但这并不重要;它们代表一个数字。函数需要知道如何解释您提供给它的字符串,而不是输出的格式(因为编译器已经知道
long
的格式)-->
strtol(十六进制,空,16)谢谢-请随意添加此答案。但是为什么,如果我转换为十进制10,它需要以16为基数?您必须指定第一个参数的基数。@user3844996您正在将字符串从以16为基数转换为带符号的长整数。整数类型不是以10为基数的,它们只是整数。您可以选择以任何方式表示整数。实际上,他们天生就是2号基地,但这并不重要;它们代表一个数字。函数需要知道如何解释您给出的字符串,而不是输出的格式(因为
long
的格式已经为编译器所熟知)。+1因为您实际上解释了原因,而不是简单地解释了