c语言16进制与10进制的转换

int HtoD(char *a){
int num=0,i;
for(i=0; i<strlen(a); i++){
if(*(a+i)>='0'&&*(a+i)<='9'){
num = num*16 + *(a+i)-'0';
}else if(*(a+i)>='A'&&*(a+i)<='Z'){
num = num*16 + *(a+i)-'A'+10;
}else if(*(a+i)>='a'&&*(a+i)<='z'){
num = num*16 + *(a+i)-'a'+10;
}else{
return -1;//表示输入错误的数
}
}
return num;
}
这是16进制转换10进制的程序,我知道16进制时逢16进一,1~9,a~f,但是程序看读懂,
希望有人能帮我理解一下,解释一下,不胜感激,谢谢!

这个函数的int HtoD(char *a);就是将16进制的数用字符数组保存,把数组首地址作为参数传递给函数,函数返回转换后的10进制整型数值。

详细说明,我写在备注里了,你看以参考。

#include <stdio.h>
#include <string.h>
int HtoD(char *a)//将16进制的数字用字符串保存,并将字符串首地址作为参数传递
{
    int num=0,i;
    for(i=0; i<strlen(a); i++)//迭代 迭代次数为a数组的长度    形参a是指针,初值是指向字符数组的首地址,也就是指向16进制数字的左边第1位
    {
        //每次迭代 取指针指向的地址值进行判断,同时指针不断往右移动
        if(*(a+i)>='0'&&*(a+i)<='9')//如果当前位是0~9的数字,那么总数值num累加同时前值*16(因为左边是高位,从高位往低位数,每多1位高位就*16)
            num = num*16 + *(a+i)-'0';
        else if(*(a+i)>='A'&&*(a+i)<='Z')//如果当前位是大写字母A~Z,转换成10进制数值,再累加
            num = num*16 + *(a+i)-'A'+10;
        else if(*(a+i)>='a'&&*(a+i)<='z')//如果当前位是小写字母a~z,转换成10进制数值,再累加
            num = num*16 + *(a+i)-'a'+10;
        else
            return -1;//表示输入错误的数
    }
    return num;
}
int main()
{
    char a[]="1F";
    printf("1F=%d",HtoD(a));  //这里我写了简单的调用,打印结果:1F=31
    return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-03-21
int HtoD(char *a){
int num = 0, i;
for (i = 0; i<strlen(a); i++){ //strlen(a)表示a数组的长度
if (*(a + i) >= '0'&&*(a + i) <= '9'){ //第一种情况字符为0~9,num*16升位,加上,字符减去基础值字符'0'获得对应的整数作为个位。
num = num * 16 + *(a + i) - '0';
}
else if (*(a + i) >= 'A'&&*(a + i) <= 'Z'){ //第二种情况字符为大写的A~Z,num*16升位,加上,字符减去基础值字符‘A’(因为‘B’是‘A’+ 1,‘C’是‘A’+ 2)获得对应的整数作为个位。
num = num * 16 + *(a + i) - 'A' + 10;
}
else if (*(a + i) >= 'a'&&*(a + i) <= 'z'){ //第二种情况字符为小写的a~z,num*16升位,加上,字符减去基础值字符‘a’获得对应的整数作为个位。
num = num * 16 + *(a + i) - 'a' + 10;
}
else{
return -1;//表示输入错误的数
}
}
return num;
}
第2个回答  推荐于2018-03-21
int HtoD(char *a){
int num=0,i;
for(i=0; i<strlen(a); i++){ //扫描整个十六进制字符串
if(*(a+i)>='0'&&*(a+i)<='9'){ //如果第i位是数字字符
num = num*16 + *(a+i)-'0'; //*16是原有数字进一位,后面部分是把数字字符转为相应数值
}else if(*(a+i)>='A'&&*(a+i)<='Z'){ //如果第i位是十六进制字符
num = num*16 + *(a+i)-'A'+10; //把大写字母转为相应数值
}else if(*(a+i)>='a'&&*(a+i)<='z'){ //若是小写字母
num = num*16 + *(a+i)-'a'+10; //把小写字母转为相应数值
}else{
return -1;//表示输入错误的数,出错提示
}
}
return num; //返回转换后的结果
}追问

谢谢你,但是我还是有些地方不懂,那个把数字字符转换为数字为什么要-'0',
然后判断字母不应该是a到f,怎么是到z
为什么把字母转换为相应数值要-a+10
谢谢

追答

把数字字符转换为数字为什么要-'0'-----'1'-'0'就是1了。

判断字母不应该是a到f,怎么是到z-----可以到f的
为什么把字母转换为相应数值要-a+10:----如果是'a',则'a'-'a'+10就转化为10了,不是吗?

本回答被提问者和网友采纳
第3个回答  2020-02-05
int
HtoD(char
*a){
int
num=0,i;
for(i=0;
i
='0'&&*(a+i)<='9'){
//如果第i位是数字字符
num
=
num*16
+
*(a+i)-'0';
//*16是原有数字进一位,后面部分是把数字字符转为相应数值
}else
if(*(a+i)>='A'&&*(a+i)<='Z'){
//如果第i位是十六进制字符
num
=
num*16
+
*(a+i)-'A'+10;
//把大写字母转为相应数值
}else
if(*(a+i)>='a'&&*(a+i)<='z'){
//若是小写字母
num
=
num*16
+
*(a+i)-'a'+10;
//把小写字母转为相应数值
}else{
return
-1;//表示输入错误的数,出错提示
}
}
return
num;
//返回转换后的结果
}
第4个回答  2020-12-03

C语言_012_十六进制转十进制

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网