2008-09-14 8 views

Respuesta

29

El valor 0xFF es un valor int firmado. C promoverá la *p a un int cuando se hace la comparación, por lo que la declaración primero si es equivalente a:

if(-1 == 255) break; 

que por supuesto es falso. Mediante el uso de (signed char)0xFF la declaración es equivalente a:

if(-1 == -1) break; 

que funciona como se espera. El punto clave aquí es que la comparación se realiza con tipos int en lugar de los tipos signed char.

+0

0xFF está firmado, no sin firmar. 0xFFU es la versión sin firmar. Solo * p necesita ser promovido. – Niall

+0

Niall: Tienes toda la razón; Actualizaré la respuesta. –

2

Se arroja a un int por primera comparación, puesto 0xFF todavía se considera un int, es decir, tu personaje entre -128 a 127, pero el 0xFF sigue siendo 255.

En el segundo caso su diciéndole que 0xFF es realmente un carácter firmado, no un int

4

Los literales enteros tienen el tipo int firmado. Como 0xFF es un int firmado, el compilador convierte * p en un int firmado y luego hace la comparación.

Cuando * p es -1, que luego se convierte de un carácter firmado a un int firmado, sigue siendo -1 que tiene una representación de 0xFFFFFFFF, que no es igual a 0xFF.

1

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; 
Cuestiones relacionadas