Comparación firmada y no firmada char

Parece tan extraño. He encontrado malentendidos. Yo uso gcc con char como char firmado. Siempre pensé que en las expresiones de comparación (y otras expresiones) el valor firmado se convierte en unsigned si es necesario.

int a = -4;
unsigned int b = a;
std::cout << (b == a) << std::endl; // writes 1, Ok

pero el problema es que

char a = -4;
unsigned char b = a;
std::cout << (b == a) << std::endl; // writes 0

¿Cuál es la magia en el operador de comparación si no es solo un bit?

Respuestas a la pregunta(3)

Su respuesta a la pregunta