0xff se verá como una constante entera, con el valor de 255. Siempre debe prestar atención a este tipo de comparación entre diferentes tipos. Si usted quiere estar seguro de que el compilador generará el código correcto, se debe utilizar el encasillado:
if(*p == (signed char)0xFF) break;
De todos modos, tenga cuidado que la siguiente declaración se no trabajo de la misma manera:
if((int)*p == 0xFF) break;
Además, tal vez sería una mejor idea para evitar caracteres firmados, o bien, se debe utilizar caracteres firmados, para compararlos con valores con signo como -1 en este caso:
if(*p == -1) break;
0xff == - 1 sólo si se asignan los valores de algunos char (o unsigned char) variables:
char a=0xff;
char b=-1;
if(a==b) break;
0xFF está firmado, no sin firmar. 0xFFU es la versión sin firmar. Solo * p necesita ser promovido. – Niall
Niall: Tienes toda la razón; Actualizaré la respuesta. –