2016-04-26 2 views
6

Я ищу устаревший встроенный проект с компилятором C30 из микрочипа для 16-битного MCU. Существует ожидаемый случай, когда индекс обходит вокруг 0xFF, который, как я думал, будет определяться по-умолчанию. Однако следующий код всегда сбрасывает меня в //sad :(, когда я ожидаю, что закончится счастливым.C unsigned char непредвиденное поведение при перекрытии

unsigned char index = 0xFF; 
unsigned char check = 0x02; 

if(check == index +3){ 
    //happy! 
}else{ 
    //sad :(
} 

Теперь, если я специально бросил его в unsigned char:

unsigned char index = 0xFF; 
unsigned char check = 0x02; 

if(check == (unsigned char) index +3){ 
    //happy! 
}else{ 
    //sad :(
} 

Он работает и я в конечном итоге в //happy! Так что я пропустил? Это просто зависимое от компилятора поведение?

+1

Попробуйте '(unsigned char) (index + 3)'. Я оставлю вопрос _why_ в качестве вспомогательной задачи для вас. И обратите внимание, что второй пример также должен ** не работать **. – Olaf

+0

Привет, Олаф, я попытался показать это в моем втором примере. Я просто не знаю, почему это сработало. Я получаю, что он переполняется, но я ожидаю, что он переполнится до 0x02. – confused

+2

Время, чтобы узнать, используя отладчик. Или просто взгляните на код Ассемблера, это отличный стартер. – Olaf

ответ

7

Причина: целые рекламные акции.

Всякий раз, когда целочисленный тип может быть представлен int в выражении, тип повышается до int.

В первом случае index стимулируется к типу INT, то добавление происходит, и вы получите значение 258, которое не делает равным 2.

Во втором случае выражение должно быть (unsigned char)(index +3), так как литая имеет но, возможно, компилятор достаточно умен, чтобы понять это.

+1

Примечание: Назначение также является выражением ... – Olaf

+1

Ах, спасибо, что привело меня к объяснению. – confused

Смежные вопросы