How does subtracting the character '0' from a char change it into an int?

c, c++, char, int, java

Solution

The value of a `char` can be 0-255, where the different characters are mapped to one of these values. The numeric digits are also stored in order `'0'` through `'9'`, but they're also not typically stored as the first ten `char` values. That is, the character `'0'` doesn't have an ASCII value of `0`. The char value of `0` is almost always the `\0` null character.

Without knowing anything else about ASCII, it's pretty straightforward how subtracting a `'0'` character from any other numeric character will result in the char value of the original character.

So, it's simple math:

'0' - '0' = 0  // Char value of character 0 minus char value of character 0
// In ASCII, that is equivalent to this:
48  -  48 = 0 // '0' has a value of 48 on ASCII chart

So, similarly, I can do integer math with any of the `char` numberics...

(('3' - '0') + ('5' - '0') - ('2' - '0')) + '0') = '6'

The difference between `3`, `5`, or `2` and `0` on the ASCII chart is exactly equal to the face value we typically think of when we see that numeric digit. Subtracting the `char '0'` from each, adding them together, and then adding a `'0'` back at the end will give us the char value that represent the char that would be the result of doing that simple math.

The code snippet above emulates `3 + 5 - 2`, but in ASCII, it's actually doing this:

((51 - 48) + (53 - 48) - (50 - 48)) + 48) = 54

Because on the ASCII chart:

0 = 48
2 = 50
3 = 51
5 = 53
6 = 54

Problem

This method works in C, C++ and Java. I would like to know the science behind it.

Original source