2010-10-01 11 views
9

Ho il seguente codice nel mio file:Perché questo confronto è sempre vero?

unsigned char * pData = new unsigned char... 

... 

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

Quando compilo, ottengo un avvertimento da parte del compilatore (GCC):

Attenzione: confronto è sempre vero a causa della limitata intervallo del tipo di dati

Come può essere? Non è il range di un unsigned char 0-255? Non ho capito bene.

+2

Ew, un 'nuovo' ... :) – GManNickG

risposta

11

Se la gamma di unsigned char è 0-255 e pData[0] è un char poi pData[0] <= 255 sarà sempre true.

5

L'espressione pData[0] <= 255 è sempre vera poiché l'intervallo di unsigned char è 0..255 (nella specifica implementazione).

Si lamenta solo di quel bit delle espressioni poiché pData[0] >= 160 può essere vero o false.

Tenete a mente che la gamma di un unsigned char non deve essere 0..255 per tutti implementazioni (standard ISO C non mandato questo).

3

La seconda parte del confronto è ridondante. E 'sempre minore o uguale a 255.

+2

* [facepalm] * Perché non l'ho visto? –

+1

Supponendo che 'CHAR_BIT' sia 8 e' char' non sia firmato. – GManNickG

+0

@GMan: Yup. Non è firmato. –

0

Si dovrebbe sempre parenthasise le espressioni per evitare ambiguità, come ad esempio:

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

Questo risolve il problema?

Il secondo confronto è ridondante, in modo da utilizzare:

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

La precedenza degli operatori non ha nulla a che fare con questo ... gli operatori relazionali hanno precedenza più elevata rispetto agli operatori logici binari. –

+0

No, non c'è ambiguità. La precedenza degli operatori fa quello che mi aspetto. –

0

non è la gamma di un unsigned char 0-255?

L'intervallo di char non firmato è definito dall'implementazione (in contrasto con alcuni degli altri post). Questo perché il numero di bit utilizzati per rappresentare un char non è sempre 8. È solo che un char occupa 1 posizione a 8 bit sulla tua particolare implementazione e quindi 255 è il limite superiore.

Quindi, nel caso in cui vi sia un altro significato associato a 255 (diverso da 'numeric_limits<char>::max() '), penso che si debba continuare a utilizzare il controllo, altrimenti il ​​controllo è ridondante.