c语言十六进制转化为十进制代码,有人能帮忙讲解一下这段程序的算法吗?
#include<stdio.h>
#include<string.h>
main()
{
int i=0,n=0;
char a[10];
unsigned long sum=0;
scanf("%s",a);
n=strlen(a);
for (i=0;i<n;i++)
{
if (a[i]>='0'&&a[i]<='9')
{
sum=sum*16;
sum=sum+a[i]-'0';
}
if (a[i]>='A'&&a[i]<='F')
{
sum=sum*16;
sum=sum+a[i]-'A'+10;
}
}
printf("%u",sum);
return 0;
}
以1EH化为十进制数为例来说明
①十六化十,方法:按权相加
1EH=1×16^1+14×16^0
=1×16+14×1
=16+14
=30
②程序中十进制数是作为字符串输入并处理的。
char a[10];
unsigned long sum=0;//sum为无符号长整型
scanf("%s",a);//十六进制数作为字符串输入
n=strlen(a);//n为此字符串长度
③for循环是从首位起逐位按权相加
如果是0~9直接进行按权相加。i=0,处理首位是a[0]=1,符合条件a[i]>='0'&&a[i]<='9',则进行if分支1:
sum=sum*16; // sum=0*16=0
sum=sum+a[i]-'0'; // sum=0+a[0]-'0'=1
如果是A~F,要将其转化为对应的十进制数码进行按权相加。i=1,次位a[0]=E,符合条件a[i]>='A'&&a[i]<='F',则进行:
sum=sum*16; // sum=1*16=16
sum=sum+a[i]-'A'+10; // sum=16+a[1]-'A'+10=16+14 =30
④处理后,打印输出(数过大时%u可避免用%d引起的溢出)
printf("%u
",sum);
下一篇:如何学会制作一个透明的CCTV?