C/C++’s char built-in type is a 1-byte type. char can hold a value [-128, 127]. The name char can be confusing because a char can range from printable characters to non-printable characters. It is easier to think of char as a 1-byte signed integer.

Convert Character char to Integer int - Modern C++

Since C++11, a new C++ expressions have been added to do compile time casting. Compile-time casting is safer as errors can be checked during compile-time over run-time. Specifically, static_cast was added which is perfect usage for converting character to integer.

#include <print>
#include <string>

void characterToInteger()
{
    using namespace std;

    char input = 'b';

    // Modern C++ cast
    int output = static_cast<int>(input);

    println("Character {} as integer is {}", input, output);
}

Output:

Character b as integer is 98

Alternative Methods

Convert Character char to Integer int - Legacy C

I don’t recommend the legacy C-style casting of converting character to integer. However, in this case, it can be safely done.

ℹ️ Tech Info: We can cast from character to integer. The char to int conversion is called an integral promotion (i.e., smaller integer to larger integer type). Additionally, because we don’t have to explicitly cast to the new type, this is considered an implicit conversion.

void characterToIntegerLegacy()
{
    using namespace std;

    char input = 'c';

    // C-style cast
    // casting from smaller to larger integer type
    int output_c_style = input;

    println("Character {} as integer is {}", input, output_c_style);
}

More static_cast Examples

Convert Character to Digit

A common conversion of a single character char is to representing a decmial digit (i.e., 0123456789) as an integer value (e.g., int).

This works in both C/C++. For example, we have a char defined as 8. First, check if the character by using isdigit to check if the char is a decimal digit. If it is, we can convert it to an integer. To convert the character to integer, we subtract '0' (that is, the character literal '0') from the char. In code, it will look like:

Note: If char just represents a number, then converting a char to int can be done without casting (‘promoted’) because int is a wider type than char.

The standard library header cctype contains other handy character identification and conversion utility functions.

ℹ️ If we want to convert a string to its integer representation check this out: Convert String to Integer in C++.

#include <print>
#include <string>
#include <cctype>

void characterToDigit(char ch)
{
    using namespace std;

    // if char contains an numeric decimal digit (0-9)
    if (isdigit(ch))
    {
        // convert character to digit
        int digit = static_cast<int>(ch - '0');

        println("'{}' becomes {}", ch, digit);
    }
    else
    {
        println("'{}' is not a digit", ch);
    }
}

Output:

// '0' becomes 0
characterToDigit('0');

// '6' becomes 6
characterToDigit('6');

// '9' becomes 9
characterToDigit('9');

// 'X' is not a digit
characterToDigit('X');

Convert character to position in alphabet

Given a character, if the character is alphabet character, print its position in the alphabet, else print error.

#include <print>
#include <string>
#include <cctype>

void characterToAlphabetPosition(char ch)
{
    using namespace std;

    // check if alphabet character
    if (isalpha(ch))
    {
        // make upper case to lower case so we can use the same formula
        int lowerCaseCharacter = tolower(ch);

        // from the lowercase character subtract 'a' (97) to offset to zero
        int positionInAlphabet = static_cast<int>(lowerCaseCharacter - 'a');

        // positions [0,25]
        // 26 positions in total
        println("{} is position {} in the alphabet", ch, positionInAlphabet);
    }
    else
    {
        println("{} is not in the alphabet", ch);
    }
}

Output:

// d is position 3 in the alphabet
characterToAlphabetPosition('d');

// A is position 0 in the alphabet
characterToAlphabetPosition('A');

// 4 is not in the alphabet
characterToAlphabetPosition('4');

Another excercise using static_cast. We can print the entire ASCII and extended ASCII characters in a table. A few notes:

  • print is new in C++23
  • the standard ASCII characters are 0 to 127 inclusive
  • the extended ASCII characters are 128 to 255 inclusive
  • iscntrl checks if character is a control character (e.g., new line), because they are not printable, print ? instead
#include <print>
#include <string>

void printAsciiTable()
{
    using namespace std;

    // adjustable results per row
    constexpr int resultsPerRow = 11;

    // print the ASCII and extended ASCII characters
    for (int i = 0; i < 256; ++i)
    {
        // static_cast index i to a character
        char ch = static_cast<int>(i);

        // if control character, print a '?' instead of character
        // static_cast to 'unsigned char' as it is required for iscntrl
        if ( iscntrl( static_cast<unsigned char>(ch) ) )
        {
            // static_cast to int so print will
            // show the integer value
            print("? {}\t", static_cast<int>(ch));
        }
        // else print the character and it's ASCII value
        else
        {
            print("{} {}\t", ch, to_string(ch));
        }
        
        // print a new line once row is filled with results
        bool newRowBegin = (ch + 1) % resultsPerRow == 0;
        if (newRowBegin)
        {
            println();
        }
    }
}

The output will be the ASCII and extended ASCII table:

? 0     ? 1     ? 2     ? 3     ? 4     ? 5     ? 6     ? 7     ? 8     ? 9     ? 10
? 11    ? 12    ? 13    ? 14    ? 15    ? 16    ? 17    ? 18    ? 19    ? 20    ? 21
? 22    ? 23    ? 24    ? 25    ? 26    ? 27    ? 28    ? 29    ? 30    ? 31      32
! 33    " 34    # 35    $ 36    % 37    & 38    ' 39    ( 40    ) 41    * 42    + 43
, 44    - 45    . 46    / 47    0 48    1 49    2 50    3 51    4 52    5 53    6 54
7 55    8 56    9 57    : 58    ; 59    < 60    = 61    > 62    ? 63    @ 64    A 65
B 66    C 67    D 68    E 69    F 70    G 71    H 72    I 73    J 74    K 75    L 76
M 77    N 78    O 79    P 80    Q 81    R 82    S 83    T 84    U 85    V 86    W 87
X 88    Y 89    Z 90    [ 91    \ 92    ] 93    ^ 94    _ 95    ` 96    a 97    b 98
c 99    d 100   e 101   f 102   g 103   h 104   i 105   j 106   k 107   l 108   m 109
n 110   o 111   p 112   q 113   r 114   s 115   t 116   u 117   v 118   w 119   x 120
y 121   z 122   { 123   | 124   } 125   ~ 126   ? 127   Ç 128   ü 129   é 130   â 131
ä 132   à 133   å 134   ç 135   ê 136   ë 137   è 138   ï 139   î 140   ì 141   Ä 142
Å 143   É 144   æ 145   Æ 146   ô 147   ö 148   ò 149   û 150   ù 151   ÿ 152   Ö 153
Ü 154   ¢ 155   £ 156   ¥ 157   ₧ 158   ƒ 159   á 160   í 161   ó 162   ú 163   ñ 164
Ñ 165   ª 166   º 167   ¿ 168   ⌐ 169   ¬ 170   ½ 171   ¼ 172   ¡ 173   « 174   » 175
░ 176   ▒ 177   ▓ 178   │ 179   ┤ 180   ╡ 181   ╢ 182   ╖ 183   ╕ 184   ╣ 185   ║ 186
╗ 187   ╝ 188   ╜ 189   ╛ 190   ┐ 191   └ 192   ┴ 193   ┬ 194   ├ 195   ─ 196   ┼ 197
╞ 198   ╟ 199   ╚ 200   ╔ 201   ╩ 202   ╦ 203   ╠ 204   ═ 205   ╬ 206   ╧ 207   ╨ 208
╤ 209   ╥ 210   ╙ 211   ╘ 212   ╒ 213   ╓ 214   ╫ 215   ╪ 216   ┘ 217   ┌ 218   █ 219
▄ 220   ▌ 221   ▐ 222   ▀ 223   α 224   ß 225   Γ 226   π 227   Σ 228   σ 229   µ 230
τ 231   Φ 232   Θ 233   Ω 234   δ 235   ∞ 236   φ 237   ε 238   ∩ 239   ≡ 240   ± 241
≥ 242   ≤ 243   ⌠ 244   ⌡ 245   ÷ 246   ≈ 247   ° 248   ∙ 249   · 250   √ 251   ⁿ 252
² 253   ■ 254

I hope it helps! ✌️