16진수를 10진수로 변환하려면 각 자릿수에서 값을 가져온 뒤 16에 해당 자릿수를 거듭제곱한 값과 곱하면 된다.
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<math.h>intmain(){charhexadecimal[20]="12C";// 16진수로 된 문자열intdecimal=0;// 10진수를 저장할 변수intposition=0;for(inti=strlen(hexadecimal)-1;i>=0;i--)// 문자열을 역순으로 반복{charch=hexadecimal[i];// 각 자릿수에 해당하는 문자를 얻음if(ch>=48&&ch<=57)// 문자가 0~9이면(ASCII 코드 48~57){// 문자에서 0에 해당하는 ASCII 코드 값을 빼고// 16에 자릿수를 거듭제곱한 값을 곱함decimal+=(ch-48)*pow(16,position);}elseif(ch>=65&&ch<=70)// 문자가 A~F이면(ASCII 코드 65~70){// 대문자로 된 16진수의 처리// 문자에서 (A에 해당하는 ASCII 코드 값 - 10)을 빼고// 16에 자릿수를 거듭제곱한 값을 곱함decimal+=(ch-(65-10))*pow(16,position);}elseif(ch>=97&&ch<=102)// 문자가 a~f이면(ASCII 코드 97~102){// 소문자로 된 16진수의 처리// 문자에서 (a에 해당하는 ASCII 코드 값 - 10)을 빼고// 16에 자릿수를 거듭제곱한 값을 곱함decimal+=(ch-(97-10))*pow(16,position);}position++;}printf("%d\n",decimal);return0;}// 300
문자열 hexadecimal의 문자가 0~9에 해당한다면 문자에서 0에 해당하는 ASCII 코드 값을 빼고 16에 자릿수를 거듭제곱한 값 pow(16, position)을 곱한다.
A~F에 해당한다면 문자에서 (A에 해당하는 ASCII 코드 값 65 - 10)을 빼고 pow(16, position)을 곱한다.
65에서 10을 빼는 이유는 A, B, C, D, E, F를 0, 1, 2, 3, 4, 5에 일치시키기 위해서이다.
만약 소문자 a~f에 해당한다면 (97 - 10)을 빼고 pow(16, position)을 곱하면 된다.