关于C语言16进制转换为10进制的问题

/*16进制转换为10进制函数*/
void short(char s[]) //数组s[]里面存放键盘输入的16进制数
{
int n=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}

问题:
为何16进制数(0至9)转换为10进制数可以用式子:
n=n*16+s[i]-'0';
而16进制数(a至f)转换为10进制数可以用式子:
n=n*16+s[i]-'a'+10;
这式子很经典啊,麻烦大家给解释一下,是怎么得到的,根据什么。

首先,说明一下,上面的程序是有错误的,正确的for循环应该这样写:
for(i=length(s);s[i]!='\0';i--)
length是输入的有效长度,转换运算应该是从最高位到最低位,才能用那些转换公式,下面解释一下公式的含义:
n=n*16+s[i]-'0'............(1)
n=n*16+s[i]-'a'+10; .......(2)
两个公式中s[i]-'0'和s[i]-'a'+10都是为了将字符转换成对应的数值,因为输入的是字符型,例如字符‘2’,因为它的对应数值是2,由‘2’-‘0’得到,如果直接类型转换,那么得到的是字符‘2’的ANSIC码值,不是2;如果是‘e’,对应值是14,同理,‘e’-‘a’+10=14,因为他们的ANSIC码值是连续的,差值加上10就是对应的整数值;
再次,每次循环都n*16,是因为权值越高,基数的阶数越高,说再多也没用,举个例子就一目了然了,例如有16进制字符数组:
2 3 E 5
转换成整型数对应是2 3 14 5
运用上面转换公式计算:((2*16+3)*16+14)*16+5
展开之后,看吧,刚好是2乘16的3次方,3乘16的2次方,14乘16的1次方,5乘16的0次方,再累加,完全符合手动计算的过程,现在应该明白了吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-21
这是因为你的转换代码本身就是将16进制串转换为16进制值,当然结果就是如此啦
for(int
i=0;b[i]!=0;i++)
{
num*=16;
//按16进制进位
if('0'<=b[i]&&b[i]<='9')
num+=b[i]-48;//如果是数字字符,转换为相应的数(0-9)
else
if('a'<=b[i]&&b[i]<='z')
num+=b[i]-87;//如果是a-f字符,转换为相应的数(0xa-0xf)
else
num+=b[i]-55;
}
printf("%d\n",num);
//打印结果,输出10进制数
第2个回答  2019-07-30
循环开始前要判断
if(b[0]=='0'
&&
(b[1]=='x'
||
b[1]
=='X'))
{
for(int
i=2;b[i]!=0;i++)
//i=2;跳过0x
{
num*=16;
if('0'<=b[i]&&b[i]<='9')
num+=b[i]-48;
else
if('a'<=b[i]&&b[i]<='z')
num+=b[i]-87;
else
if('A'<=b[i]&&b[i]<='Z')
num+=b[i]-55;
else
break;//非法字符,结束循环
}
}

相关了解……

你可能感兴趣的内容

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