toupper devuelve entero en lugar de char

para la siguiente función

void display()
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (board[i][j] < 84 && (i+j)%2 == 0)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70);
            else if (board[i][j] < 84 && (i+j)%2 == 1)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0xc0);
            else if (board[i][j] > 97 && (i+j)%2 == 0)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x7c);
            else if (board[i][j] > 97 && (i+j)%2 == 1)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0xc7);
            cout << " " << toupper(board[i][j]) << " ";
        }
        cout << endl;
    }
}

en lugar de devolver caracteres para el tablero de caracteres [8] [8], devuelve enteros para que mi salida se vea como

 82  78  66  81  75  66  78  82

 80  80  80  80  80  80  80  80 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 80  80  80  80  80  80  80  80 

 82  78  66  81  75  66  78  82 

en lugar de la salida esperada de

 R  N  B  Q  K  B  N  R

 P  P  P  P  P  P  P  P




 P  P  P  P  P  P  P  P

 R  N  B  Q  K  B  N  R

También he intentado declarar un char a = board [i] [j]; cout << toupper (a); en un intento de confirmar el tipo de variable como un carácter y recibió la misma salida.

esta es una tarea para una clase, por lo que no espero mucha ayuda, solo quiero saber por qué mi función está devolviendo enteros en lugar de caracteres para saber cuál es mi error para referencia futura, Google no ayudó mucho. ¿Es algún tipo de problema de alcance con toupper?

Respuestas a la pregunta(4)

Su respuesta a la pregunta