La comparaison de caractères avec des valeurs hexadécimales

Pour le dernier jour, j'ai eu un méchant bug dans mon code qui après quelques recherches, semble être liée à la comparaison entre le char des valeurs et de l'hex. Mon compilateur est gcc 4.4.1 en cours d'exécution sur Windows.
J'ai reproduit le problème dans le simple code ci-dessous:

char c1 = 0xFF; char c2 = 0xFE;
if(c1 == 0xFF && c2 == 0xFE)
{
    //do something
}

Étonnamment le code ci-dessus ne fait pas dans la boucle. Je n'ai absolument aucune idée de pourquoi et voudrais vraiment l'apprécier un peu d'aide sur ce. C'est tellement absurde que la solution doit être (comme toujours) une énorme erreur de ma part que j'ai totalement négligé.

Si je remplace le dessus avec des caractères non signés cela fonctionne, mais seulement dans certains cas. J'ai du mal à savoir ce qu'il se passe. En plus si je jette les valeurs hexadécimales de char en comparaison, il entre dans la boucle correctement comme suit:

if(c1 == (char)0xFF && c2 == (char)0xFE)
{
    //do something
}

Ça veut dire quoi? Pourquoi peut-il se passer? N'est-ce pas la brute valeur hex interprété comme un char par défaut?
Pour les curieux, le point dans mon code où j'ai d'abord remarqué c'est la comparaison des 2 premiers octets d'un ruisseau au-dessus de la valeur hex et leur reverse à l'identité de la Marque d'Ordre d'Octet.

Toute aide est appréciée

OriginalL'auteur Lefteris | 2012-01-13