Giải thích bài chuyển từ Hex sang Dec

Đây là bài chuyển từ Hex sang Dec của thầy em! Em có chỗ chưa hiểu ở dòng tính kết quả. Ai giải thích giúp em với ạ.

#include<stdio.h>
#include<string.h>
#include<math.h>
void xuat(long kq);
void nhap(char S[]);
long doisangthapphan(char S[]);
void main()
{
	char S[30];
	nhap(S);
	long kq=doisangthapphan(S);
	xuat(kq);
}
void nhap(char S[])
{
	gets(S);
}
void xuat(long kq)
{
	printf("%ld",kq);
}
long doisangthapphan(char S[])
{
	long kq=0;
	int len=strlen(S);
	for (int i=0; i<len; i++)
		if (S[i]>='0' && S[i]<='9')
			kq+= (S[i]-'0') * (long)pow(16,len-1-i);
		else
			kq+= (S[i]-55) * (long)pow(16,len-1-i);
	return kq;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?