# C++ Program to Convert Hexadecimal to Decimal

« Previous Program Next Program »

In this article, you will learn and get code on hexadecimal to decimal conversion in C++. Here are the list of programs, you will go through:

• Hexadecimal (without fractional part) to Decimal Conversion
• Hexadecimal (with fractional part or with decimal point) to Decimal Conversion
• Hexadecimal to Decimal Conversion using Function and Pointer

Before going through these programs, if you're not aware about some simple steps and formula used for the conversion, then you can refer to hexadecimal to decimal to get every required things.

## Hexadecimal to Decimal in C++

To convert a number from hexadecimal to decimal in C++ programming, you have to ask from user to enter the hexadecimal number first. And then convert it into its equivalent decimal value. as shown in the program given below.

The question is, write a program in C++ that converts hexadecimal number to decimal number. Here is its answer:

```#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int decimalNum=0, rem, i=0, len=0;
char hexDecNum;
cin>>hexDecNum;
while(hexDecNum[i]!='\0')
{
len++;
i++;
}
len--;
i=0;
while(len>=0)
{
rem = hexDecNum[len];
if(rem>=48 && rem<=57)
rem = rem-48;
else if(rem>=65 && rem<=70)
rem = rem-55;
else if(rem>=97 && rem<=102)
rem = rem-87;
else
{
cout<<"\nInvalid Hex Digit!";
cout<<endl;
return 0;
}
decimalNum = decimalNum + (rem*pow(16, i));
len--;
i++;
}
cout<<"\nEquivalent Decimal Value: "<<decimalNum;
cout<<endl;
return 0;
}```

This program was build and run under Code::Blocks IDE. Here is its sample run:

Now supply any hexadecimal number input say 1D7F and press `ENTER` key to convert and prints its equivalent decimal value as shown in the snapshot given below:

Program doesn't cares about the case of alphabet A-F (hex characters corresponds to hex digits 10 to 15). That is, either entered in lowercase or in uppercase as shown in the output given below:

The dry run of above program with hexadecimal number input 1D7F goes like:

• Initial values, decimalNum=0, i=0, len=0
• When user enters hexadecimal number say 1D7F, then it gets stored in hexDecNum, in a way that:
• hexDecNum=1
• hexDecNum=D
• hexDecNum=7
• hexDecNum=F
• and a null terminated character \0 gets assigned to fourth index. That is, hexDecNum=\0
• Now using while loop, the length of hexDecNum[] gets calculated. That is, how many characters entered as hexadecimal input. The while loop evaluates in this way:
• The condition hexDecNum[i]!='\0' or hexDecNum!='\0' or 1!='\0' evaluates to be true, therefore program flow goes inside the loop, and increments the value of both variables say len and i. So, i=1 and len=1
• Program flow goes back and evaluates the condition again. That is, the condition hexDecNum[i]!='\0' or hexDecNum!='\0' or D!='\0' evaluates to be true again, therefore program flow again goes inside the loop and increments the value of both variables
• Evaluation of while loop continues, until the condition evaluates to be false. That is, when the value of i becomes equal to 4. The conditionn evaluates to be false, because there is no any character available at that index (fourth index). Therefore it gets matched with a null terminated character (\0)
• Now the value of len gets decremented. So len=3 and i=0
• The condition of second while loop gets evaluated
• That is, the condition len>=0 or 3>=0 evaluates to be true, therefore program flow goes inside the loop
• There, hexDecNum[len] or hexDecNum or F gets initialized to rem
• Because, rem is of int (integer) type, therefore the ASCII value of F gets initialized to rem. So rem=70
• Now using if-else, we've compared the value of rem (with ASCII values of 0-9, A-F and a-f) and processed the statement accordingly.
• That is, because rem (70) is neither greater than or equal to 48 nor less than or equal to 57. Therefore the first else if's condition gets evaluated. That is, the condition rem<=70 or 70<=70 evaluates to be true, therefore rem-55 or 70-55 or 15 gets initialized to rem. 15 corresponds to F
• Now decimalNum + (rem*pow(16, i)) or 0 + (15*pow(16, 0)) or 15*160 or 15*1 or 15 gets initialized to decimalNum
• The value of len gets decremented. So len=2
• And the value of i gets incremented. So i=1
• Now program flow goes back and the condition of while loop gets evaluated
• That is, the condition, len>=0 or 2>=0 again evaluates to be true, therefore program flow again goes inside the loop, and process the code in similar way as told above
• Continue the process in similar way until the condition evaluates to be false.
• On continuing the process, we'll get the values in this way:
• rem=70, rem=15, decimalNum=15, len=2, i=1
• rem=55, rem=7, decimalNum=127, len=1, i=2
• rem=68, rem=13, decimalNum=3455, len=0, i=3
• rem49, rem=1, decimalNum=7551, len=(-1), i=4)
• Because, the value of len is now less than 0, therefore the condition evaluates to be false, and the evaluation of while loop gets ended
• Print the value of decimalNum as output. That is, 7551

You can also compare and process directly with the character of hexDecNum[] one by one. To do this, replace the following block of code:

```if(rem>=48 && rem<=57)
rem = rem-48;
else if(rem>=65 && rem<=70)
rem = rem-55;
else if(rem>=97 && rem<=102)```

with the block of code given below:

```if(rem>='0' && rem<='9')
rem = rem-48;
else if(rem>='A' && rem<='F')
rem = rem-55;
else if(rem>='a' && rem<='f')```

### Without using pow() Function

If you don't want to use pow() function of math.h header file, then you can replace the following statement:

`decimalNum = decimalNum + (rem*pow(16, i));`

with

```k=1;
mul=1;
while(k<=i)
{
mul=16*mul;
k++;
}
decimalNum = decimalNum + (rem*mul);```

Note - Don't forgot to declare both new variables k and mul at start of the program. And remove the header file, math.h. Rest of the things will be same.

### What if Hexadecimal Number contains Fractional Part ?

To deal with a type of input that contains fractional part. That is a hexadecimal number containing fractional part (or decimal point), use the following program:

```#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int decimalNum=0, decNumOne=0, dotPosition=0;
int rem, i=0, len=0, lenTemp;
float decNumTwo=0;
char hexDecNum;
cin>>hexDecNum;
while(hexDecNum[i]!='\0')
{
if(hexDecNum[i]=='.')
dotPosition = i;
len++;
i++;
}
len--;
i=0;
if(dotPosition==0)
{
while(len>=0)
{
rem = hexDecNum[len];
if(rem>=48 && rem<=57)
rem = rem-48;
else if(rem>=65 && rem<=70)
rem = rem-55;
else if(rem>=97 && rem<=102)
rem = rem-87;
else
{
cout<<"\nInvalid Hex Digit!";
cout<<endl;
return 0;
}
decimalNum = decimalNum + (rem*pow(16, i));
len--;
i++;
}
cout<<"\nEquivalent Decimal Value: "<<decimalNum;
}
else
{
lenTemp = dotPosition-1;
while(lenTemp>=0)
{
rem = hexDecNum[lenTemp];
if(rem>=48 && rem<=57)
rem = rem-48;
else if(rem>=65 && rem<=70)
rem = rem-55;
else if(rem>=97 && rem<=102)
rem = rem-87;
else
{
cout<<"\nInvalid Hex Digit!";
cout<<endl;
return 0;
}
decNumOne = decNumOne + (rem*pow(16, i));
lenTemp--;
i++;
}
lenTemp = dotPosition+1;
i=-1;
while(lenTemp<=len)
{
rem = hexDecNum[lenTemp];
if(rem>=48 && rem<=57)
rem = rem-48;
else if(rem>=65 && rem<=70)
rem = rem-55;
else if(rem>=97 && rem<=102)
rem = rem-87;
else
{
cout<<"\nInvalid Hex Digit!";
cout<<endl;
return 0;
}
decNumTwo = decNumTwo + (rem*pow(16, i));
lenTemp++;
i--;
}
decNumTwo = decNumOne+decNumTwo;
cout<<"\nEquivalent Decimal Value: "<<decNumTwo;
}
cout<<endl;
return 0;
}```

Here is its sample run with hexadecimal number input as 5A9.63

The variable dotPosition is used here, that checks whether decimal point is available in the hexadecimal input or not. If hexadecimal input contains fractional part (or has decimal point), then 1 gets initialized to dotPosition variable. Checks later, whether its value is equal to 0 or not. If it is equal to 0 (means 1 does not gets initialized to it), then process the normal conversion, otherwise deal with different rules as shown in above program.

That is, if a hexadecimal number contains fractional part (or decimal point), then we've used two part. One before decimal and one after decimal.

The part that is available before decimal, gets converted into its equivalent decimal value and initialized to decNumOne. Whereas the part that is available after decimal, gets converted into its equivalent decimal value and initialized to decNumTwo (float type variable). Finally add and print the value.

Note - The rules to convert hexadecimal (after decimal point) to decimal is already discussed in the article of Hexadecimal (with Fractional) to Decimal.

### Using Function and Pointer

This program uses function and pointer to convert hexadecimal to decimal in C++.

```#include<iostream>
#include<math.h>
using namespace std;
unsigned long HexDecToDec(char []);
int main()
{
unsigned long decimalNum;
char hexDecNum;
cin>>hexDecNum;
decimalNum = HexDecToDec(hexDecNum);
if(decimalNum==0)
cout<<"\nInvalid Hex Digit!";
else
cout<<"\nEquivalent Decimal Value: "<<decimalNum;
cout<<endl;
return 0;
}
unsigned long HexDecToDec(char hexDecNum[])
{
char *hexDecPointer;
int i, len = 0;
const int base = 16;
unsigned long decimalNum = 0;
// Find the len of Hexadecimal Number
for(hexDecPointer=hexDecNum; *hexDecPointer != '\0'; hexDecPointer++)
len++;
hexDecPointer = hexDecNum;
// Now convert hex digit to decimal number one by one
for(i=0; *hexDecPointer != '\0' || i<len; i++, hexDecPointer++)
{
if(*hexDecPointer>=48 && *hexDecPointer<=57)
decimalNum = decimalNum + (*hexDecPointer - 48)*pow(base, len-i-1);
else if(*hexDecPointer>=65 && *hexDecPointer<=70)
decimalNum = decimalNum + (*hexDecPointer - 55)*pow(base, len-i-1);
else if(*hexDecPointer>=97 && *hexDecPointer<=102)
decimalNum = decimalNum + (*hexDecPointer - 87)*pow(base, len-i-1);
else
len=0;
}
if(len==0)
return 0;
else
return decimalNum;
}```

Note - This program doesn't work with hexadecimal input containing fractional (decimal) part.

To create the program using user-defined function that converts hexadecimal (with fractional part) to its equivalent decimal value. Then you can use the program that I've already mentioned above to deal with this type of input. Just alter it and create with yourself.

#### Same Program in Other Languages

C++ Online Test

« Previous Program Next Program »