Porównanie podpisanego i niepodpisanego znaku

To wydaje się takie dziwne. Znalazłem nieporozumienie. Używam gcc z char jako podpisanym char. Zawsze myślałem, że w wyrażeniach porównawczych (i innych wyrażeniach) podpisana wartość konwertuje na niepodpisaną, jeśli to konieczne.

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

ale problem polega na tym

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

jaki jest magiczny operator porównania, jeśli nie jest tylko bitowy?

questionAnswers(3)

yourAnswerToTheQuestion