2010-10-01 20 views
9

J'ai le code suivant dans mon fichier:Pourquoi cette comparaison est-elle toujours vraie?

unsigned char * pData = new unsigned char... 

... 

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

Quand je compile, je reçois un avertissement du compilateur (gcc):

Attention: comparaison est toujours vrai en raison de limiter plage de type de données

Comment cela peut-il être? Est-ce que la portée d'un unsigned char 0-255? Je suis confus.

+2

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

Répondre

11

Si la plage de unsigned char est 0-255 et pData[0] est un char alors pData[0] <= 255 sera toujours true.

5

L'expression pData[0] <= 255 est toujours vraie car la plage de unsigned char est de 0..255 (dans votre implémentation particulière).

Il se contente seulement de ce bit des expressions puisque pData[0] >= 160 peut être vrai ou faux. Gardez à l'esprit que la plage d'un unsigned char n'a pas besoin d'être 0..255 pour toutes les implémentations (les normes ISO C ne l'exigent pas).

3

La seconde partie de la comparaison est redondante. Il est toujours inférieur ou égal à 255.

+2

* [facepalm] * Pourquoi je n'ai pas vu ça? –

+1

En supposant que 'CHAR_BIT' est 8 et' char' est non signé. – GManNickG

+0

@GMan: Oui. C'est non signé. –

0

Vous devez toujours parenthasise vos expressions pour éviter toute ambiguïté, comme:

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

Est-ce résoudre le problème?

La deuxième comparaison est redondant, utilisez donc:

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

La priorité des opérateurs n'a rien à voir avec cela ... les opérateurs relationnels ont une priorité plus élevée que les opérateurs logiques binaires. –

+0

Non, il n'y a pas d'ambiguïté. La priorité de l'opérateur fait ce à quoi je m'attends. –

0

n'est pas la portée d'un omble chevalier 0-255 non signé?

La plage de caractères non signés est définie par l'implémentation (contrairement à certains autres postes). C'est parce que le nombre de bits utilisés pour représenter un char n'est pas toujours 8. C'est juste qu'un char prend 1 emplacement 8bit sur votre implémentation particulière et donc 255 est la limite supérieure. Donc, dans le cas où il y a une autre signification attachée à 255 (autre que 'numeric_limits<char>::max() '), je pense que vous devriez toujours aller de l'avant et utiliser la vérification, sinon la vérification est redondante.