NON E' un problema di tolower/toupper, MA il tipo di risultato!
UNA COSA e' un "char" (che E' ANCHE un intero a 8 bit con o senza segno, DIPENDE dalla configurazione del compilatore) ed UN'ALTRA COSA e' un int.
IN GENERALE, "cout" TRATTA il char come un carattere, NON come un intero!
std::cout << 'a' << ' ' << (int)'a' << ' ' << putchar(97) << ' ' << 97 << ' ' << char(97) << std::endl;
ALTRO problema: in C/C++ ci sono DUE modi per scrivere sulla console:
1) le funzioni alla C ("putchar")
2) gli stream alla C++ ("std::cout" e l'operatore "<<")
E' UNA PESSIMISSIMISSIMA IDEA mescolare i due mondi.