How do I convert a `char` to an `int` in C and C++?

## Solution 1

Depends on what you want to do:

to read the value as an ascii code, you can write

``````char a = 'a';
int ia = (int)a;
/* note that the int cast is not necessary -- int ia = a would suffice */
``````

to convert the character `'0' -> 0`, `'1' -> 1`, etc, you can write

``````char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */
``````

Explanation:
`a - '0'` is equivalent to `((int)a) - ((int)'0')`, which means the ascii values of the characters are subtracted from each other. Since `0` comes directly before `1` in the ascii table (and so on until `9`), the difference between the two gives the number that the character `a` represents.

## Solution 2

Well, in ASCII code, the numbers (digits) start from 48. All you need to do is:

``````int x = (int)character - 48;
``````

Or, since the character '0' has the ASCII code of 48, you can just write:

``````int x = character - '0';  // The (int) cast is not necessary.
``````

## Solution 3

C and C++ always promote types to at least `int`. Furthermore character literals are of type `int` in C and `char` in C++.

You can convert a `char` type simply by assigning to an `int`.

``````char c = 'a'; // narrowing on C
int a = c;
``````

## Solution 4

char is just a 1 byte integer. There is nothing magic with the char type! Just as you can assign a short to an int, or an int to a long, you can assign a char to an int.

Yes, the name of the primitive data type happens to be "char", which insinuates that it should only contain characters. But in reality, "char" is just a poor name choice to confuse everyone who tries to learn the language. A better name for it is int8_t, and you can use that name instead, if your compiler follows the latest C standard.

Though of course you should use the char type when doing string handling, because the index of the classic ASCII table fits in 1 byte. You could however do string handling with regular ints as well, although there is no practical reason in the real world why you would ever want to do that. For example, the following code will work perfectly:

``````  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };

for(i=0; i<6; i++)
{
printf("%c", str[i]);
}
``````

You have to realize that characters and strings are just numbers, like everything else in the computer. When you write 'a' in the source code, it is pre-processed into the number 97, which is an integer constant.

So if you write an expression like

``````char ch = '5';
ch = ch - '0';
``````

this is actually equivalent to

``````char ch = (int)53;
ch = ch - (int)48;
``````

which is then going through the C language integer promotions

``````ch = (int)ch - (int)48;
``````

and then truncated to a char to fit the result type

``````ch = (char)( (int)ch - (int)48 );
``````

There's a lot of subtle things like this going on between the lines, where char is implicitly treated as an int.

## Solution 5

(This answer addresses the C++ side of things, but the sign extension problem exists in C too.)

Handling all three `char` types (`signed`, `unsigned`, and `char`) is more delicate than it first appears. Values in the range 0 to `SCHAR_MAX` (which is 127 for an 8-bit `char`) are easy:

``````char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;
``````

But, when `somevalue` is outside of that range, only going through `unsigned char` gives you consistent results for the "same" `char` values in all three types:

``````char c = somevalue;
signed char sc = c;
unsigned char uc = c;
// Might not be true: int(c) == int(sc) and int(c) == int(uc).
int nc = (unsigned char)c;
int nsc = (unsigned char)sc;
int nuc = (unsigned char)uc;
// Always true: nc == nsc and nc == nuc.
``````

This is important when using functions from ctype.h, such as `isupper` or `toupper`, because of sign extension:

``````char c = negative_char;  // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n);  // Undefined behavior.
``````

Note the conversion through int is implicit; this has the same UB:

``````char c = negative_char;
bool b = isupper(c);
``````

To fix this, go through `unsigned char`, which is easily done by wrapping ctype.h functions through safe_ctype:

``````template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }

//...
char c = CHAR_MIN;
bool b = safe_ctype<isupper>(c);  // No UB.

std::string s = "value that may contain negative chars; e.g. user input";
std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>);
// Must wrap toupper to eliminate UB in this case, you can't cast
// to unsigned char because the function is called inside transform.
``````

This works because any function taking any of the three char types can also take the other two char types. It leads to two functions which can handle any of the types:

``````int ord(char c) { return (unsigned char)c; }
char chr(int n) {
assert(0 <= n);  // Or other error-/sanity-checking.
assert(n <= UCHAR_MAX);
return (unsigned char)n;
}

// Ord and chr are named to match similar functions in other languages
// and libraries.
``````

`ord(c)` always gives you a non-negative value even when passed a negative `char` or negative `signed char` and `chr` takes any value `ord` produces and gives back the exact same `char`.

In practice, I would probably just cast through `unsigned char` instead of using these, but they do succinctly wrap the cast, provide a convenient place to add error checking for `int`-to-`char`, and would be shorter and more clear when you need to use them several times in close proximity.

## Solution 6

Use `static_cast<int>`:

``````int num = static_cast<int>(letter); // if letter='a', num=97
``````

Edit: You probably should try to avoid to use `(int)`

int num = (int) letter;

check out Why use static_cast<int>(x) instead of (int)x? for more info.

## Solution 7

I have absolutely `null` skills in C, but for a simple parsing:

``````char* something = "123456";

int number = parseInt(something);
``````

...this worked for me:

``````int parseInt(char* chars)
{
int sum = 0;
int len = strlen(chars);
for (int x = 0; x < len; x++)
{
int n = chars[len - (x + 1)] - '0';
sum = sum + powInt(n, x);
}
return sum;
}

int powInt(int x, int y)
{
for (int i = 0; i < y; i++)
{
x *= 10;
}
return x;
}
``````

## Solution 8

It sort of depends on what you mean by "convert".

If you have a series of characters that represents an integer, like "123456", then there are two typical ways to do that in C: Use a special-purpose conversion like atoi() or strtol(), or the general-purpose sscanf(). C++ (which is really a different language masquerading as an upgrade) adds a third, stringstreams.

If you mean you want the exact bit pattern in one of your `int` variables to be treated as a `char`, that's easier. In C the different integer types are really more of a state of mind than actual separate "types". Just start using it where `char`s are asked for, and you should be OK. You might need an explicit conversion to make the compiler quit whining on occasion, but all that should do is drop any extra bits past 256.

## Solution 9

Presumably you want this conversion for using functions from the C standard library.

In that case, do (C++ syntax)

``````typedef unsigned char UChar;

char myCppFunc( char c )
{
return char( someCFunc( UChar( c ) ) );
}
``````

The expression `UChar( c )` converts to `unsigned char` in order to get rid of negative values, which, except for EOF, are not supported by the C functions.

Then the result of that expression is used as actual argument for an `int` formal argument. Where you get automatic promotion to `int`. You can alternatively write that last step explicitly, like `int( UChar( c ) )`, but personally I find that too verbose.

Cheers & hth.,

## Solution 10

I recomend to use the following function:

``````/* chartoint: convert char simbols to unsigned int*/
int chartoint(char s[])
{

int i, n;
n = 0;
for (i = 0; isdigit(s[i]); ++i){
n = 10 * n + (s[i] - '0');
}
return n;
}
``````

The result of function could be checked by:

``````printf("char 00: %d \r\n", chartoint("00"));
printf("char 01: %d \r\n", chartoint("01"));
printf("char 255: %d \r\n", chartoint("255"));
``````

## Solution 11

I was having problems converting a char array like `"7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"` into its actual integer value that would be able to be represented by `7C' as one hexadecimal value. So, after cruising for help I created this, and thought it would be cool to share.

This separates the char string into its right integers, and may be helpful to more people than just me ;)

``````unsigned int* char2int(char *a, int len)
{
int i,u;
unsigned int *val = malloc(len*sizeof(unsigned long));

for(i=0,u=0;i<len;i++){
if(i%2==0){
if(a[i] <= 57)
val[u] = (a[i]-50)<<4;
else
val[u] = (a[i]-55)<<4;
}
else{
if(a[i] <= 57)
val[u] += (a[i]-50);
else
val[u] += (a[i]-55);
u++;
}
}
return val;
}
``````

Hope it helps!

## Solution 12

For char or short to int, you just need to assign the value.

``````char ch = 16;
int in = ch;
``````

Same to int64.

``````long long lo = ch;
``````

All values will be 16.

## Solution 13

Use "long long" instead a "int" so it works for bigger numbers. Here the elegant solution.

``````long long ChardToint(char *arr, size_t len){

int toptenf=1;
long long toptenLf=10000000LL;
long long makeintf=3000000000000;

makeintf= 0LL;

int holdNumberf=0;
for(int i=len-1;i>=0 ;i--){
switch(arr[i]){
case '0':
holdNumberf=0;
break;
case '1':
holdNumberf=1;
break;
case '2':
holdNumberf=2;
break;
case '3':
holdNumberf=3;
break;
case '4':
holdNumberf=4;
break;
case '5':
holdNumberf=5;
break;
case '6':
holdNumberf=6;
break;
case '7':
holdNumberf=7;
break;
case '8':
holdNumberf=8;
break;
case '9':
holdNumberf=9;
break;

default:
holdNumberf=0;
}
if(toptenf>=10000000){
makeintf=makeintf+holdNumberf*toptenLf;

toptenLf=toptenLf*10;
}else{
makeintf=makeintf+holdNumberf*toptenf;

toptenf=toptenf*10;
}
}
return makeintf;

}
``````

## Solution 14

``````int charToint(char a){
char *p = &a;
int k = atoi(p);
return k;
}
``````

You can use this atoi method for converting char to int. For more information, you can refer to this http://www.cplusplus.com/reference/cstdlib/atoi/ , http://www.cplusplus.com/reference/string/stoi/.