0xff будет рассматриваться как целочисленная константа со значением 255. Вы всегда должны обращать внимание на такого рода сравнения между различными типами. Если вы хотите быть уверены в том, что компилятор сгенерирует правильный код, вы должны использовать приведение типа:
if( *p == (signed char)0xFF ) break;
В любом случае, остерегайтесь , что следующее утверждение будет не работать так же:
if( (int)*p == 0xFF ) break;
Кроме того, возможно, было бы лучше избежать подписанных символов или, если вы должны использовать подписанные символы, сравнить их со значениями со знаком, такими как -1, в данном случае:
if( *p == -1 ) break;
0xff == - 1, только если эти значения будут присвоены некоторым переменным типа char (или unsigned char):
char a=0xff;
char b=-1;
if(a==b) break;