2010-10-01 18 views
9

tengo el siguiente código en mi archivo:¿Por qué esta comparación es siempre cierta?

unsigned char * pData = new unsigned char... 

... 

if(pData[0] >= 160 && pData[0] <= 255) 

Cuando compilo, recibo una advertencia del compilador (gcc):

Advertencia: la comparación es siempre verdad debido al limitado rango de tipo de datos

¿Cómo puede ser esto? ¿No es el rango de unsigned char 0-255? Estoy confundido.

+2

Ew, a 'new' ... :) – GManNickG

Respuesta

11

Si el rango de unsigned char es 0-255 y pData[0] es una continuación charpData[0] <= 255 siempre habrá true.

5

La expresión pData[0] <= 255 es siempre cierta, ya que el rango de unsigned char es 0..255 (en su implementación concreta).

Solo se queja de ese bit de las expresiones ya que pData[0] >= 160 puede ser verdadero o falso.

Tenga en cuenta que el rango de un unsigned char no tiene que ser 0..255 para todas las implementaciones (normas ISO C no obligan a esto).

3

La segunda parte de la comparación es redundante. Siempre es menor o igual a 255.

+2

* [facepalm] * ¿Por qué no vi eso? –

+1

Suponiendo que 'CHAR_BIT' es 8 y' char' no está firmado. – GManNickG

+0

@GMan: Sí. No tiene firma. –

0

Siempre debe parenthasise sus expresiones para evitar la ambigüedad, como por ejemplo:

if ((pData[0] >= 160) && (pData[0] <= 255)) 

¿Este soluciona el problema?

La segunda comparación es redundante, a fin de utilizar:

if (pData[0] >= 160) 
+1

La precedencia del operador no tiene nada que ver con esto ... los operadores relacionales tienen mayor prioridad que los operadores lógicos binarios. –

+0

No, no hay ambigüedad. La precedencia del operador hace lo que yo espero. –

0

no es el rango de un unsigned char 0-255?

El rango de char sin signo está definido por la implementación (en contraste con algunas de las otras publicaciones). Esto se debe a que la cantidad de bits utilizados para representar un carácter no siempre es 8. Es solo que un char toma 1 ubicación de 8 bits en su implementación particular y, por lo tanto, 255 es el límite superior.

Por lo tanto, en caso de que haya algún otro significado adjunto a 255 (que no sea 'numeric_limits<char>::max() '), creo que todavía debe seguir adelante y usar el cheque, de lo contrario, la verificación es redundante.

Cuestiones relacionadas