0xff będzie widziane jako stała liczbowa o wartości 255. Należy zawsze zwracać uwagę na takie porównanie różnych typów. Jeśli chcesz mieć pewność, że kompilator wygeneruje właściwy kod, należy użyć typecast:
if(*p == (signed char)0xFF) break;
Zresztą uważaj że następne oświadczenie woli nie działają tak samo:
if((int)*p == 0xFF) break;
Ponadto, może byłoby lepszym pomysłem, aby uniknąć znaki podpisane, lub, że trzeba użyć podpisane znaków i porównać je z wartościami takimi jak podpisanych -1 w tym przypadku:
if(*p == -1) break;
0xFF == - 1 tylko wtedy, gdy te wartości zostaną przypisane do jakiegoś char (lub unsigned char) zmienne:
char a=0xff;
char b=-1;
if(a==b) break;
0xFF jest podpisane, nie podpisany. 0xFFU to niepodpisana wersja. Tylko * p musi być promowany. – Niall
Niall: Masz całkowitą rację; Zaktualizuję odpowiedź. –