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.