Сравнение символов с шестнадцатеричными значениями

В последний день в моем коде произошла неприятная ошибка, которая после некоторого поиска, похоже, связана со сравнением значений char и hex. Мой компилятор - gcc 4.4.1, работающий в Windows. Я воспроизвел проблему в простом коде ниже:

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

Как ни странно, приведенный выше код не попадает в цикл. Я понятия не имею, почему, и был бы очень признателен за помощь в этом. Это настолько абсурдно, что решение должно быть (как всегда) огромной ошибкой с моей стороны, которую я полностью упустил.

Если я заменю указанное выше на символы без знака, это сработает, но только в некоторых случаях. Я изо всех сил пытаюсь понять, что происходит. Вдобавок, если я преобразовал шестнадцатеричные значения в char для сравнения, он правильно войдет в цикл, например:

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

Что это означает? Почему это может происходить? Разве необработанное шестнадцатеричное значение по умолчанию интерпретируется как символ? Любопытно, что момент в моем коде, где я впервые заметил, это сравнение первых 2 байтов потока с указанным выше шестнадцатеричным значением и их обратное значение для идентификации метки порядка байтов.

Любая помощь приветствуется.

6
задан Lefteris 13 January 2012 в 07:19
поделиться