EEVIAC: that's how it works with strings in every language, though- the characters are of course stored as their ASCII/ANSI/Unicode equivalent. The difference here is that C and C++ have no "byte" datatype- their "byte" is the char data type.
the i/o routines, and everything, treat it as a number. Nothing treats it like a string, or a string character.- however, when C or C++ send it to the Operating System display routines- the console treats it like an ASCII code- a byte being sent with 65 is represented with an A. this makes sense, in that printing 65 instead would indicate the writing of two, rather then one, byte. So we have it like this:
1. C/C++ program works with char data type (perhaps an array). it is treated, they get no special treatment- uppercasing is as easy as subtracting 32 in certain circumstances, and lowercase by adding 32.
2. at some point, the program sends the char data off to an output function.
3. the output function is explicitly designed to accept an array of bytes and translate them into display characters. note that this obviously doesn't apply for writing to a file- in that case the data is simply written to the file (if the file is later loaded by a text editor the various byte values are translated to the characters you see on-screen).