2008-09-14 10 views
8

Si j'ai:variable C et la comparaison de valeur constante ne correspond pas à

signed char * p; 

et je fais une comparaison:

if (*p == 0xFF) 
    break; 

il ne rattrapera jamais 0xFF, mais si je le remplace par -1 il volonté:

if (*p == (signed char)0xFF) 
    break; 

Comment cela est-il possible? Est-ce quelque chose avec le drapeau de signe? Je pense que c'est 0xFF == -1 == 255.

Répondre

29

La valeur 0xFF est une valeur int signée. C favorisera la *p à un int lorsque vous faites la comparaison, si la première instruction if est équivalent à:

if(-1 == 255) break; 

qui est évidemment faux. En utilisant (signed char)0xFF la déclaration équivaut à:

if(-1 == -1) break; 

qui fonctionne comme prévu. Le point clé ici est que la comparaison est faite avec int types au lieu de types.

+0

0xFF est signé, non signé. 0xFFU est la version non signée. Seul * p doit être promu. – Niall

+0

Niall: Vous avez raison; Je vais mettre à jour la réponse. –

2

Il jette un entier pour la première comparaison depuis 0xFF est toujours considéré comme un int, ce qui signifie votre personnage -128 à 127, mais le 0xFF est encore 255.

Dans le second cas que vous le précisiez que 0xFF est vraiment un caractère signé, pas un int

4

Les littéraux entiers ont un type int signé. Puisque 0xFF est un int signé, le compilateur convertit * p en un int signé, puis effectue la comparaison.

Lorsque * p est -1, qui est ensuite converti à partir d'un caractère signé en un int signé, il est toujours -1 qui a une représentation de 0xFFFFFFFF, qui n'est pas égale à 0xFF.

1

0xff sera vu comme une constante entière, avec la valeur de 255. Vous devriez toujours faire attention à ce genre de comparaison entre différents types. Si vous voulez être sûr que le compilateur génère le bon code, vous devez utiliser le transtypage:

 
if(*p == (signed char)0xFF) break; 

Quoi qu'il en soit, méfiez-vous que la déclaration suivante sera pas travail de la même façon:

 
if((int)*p == 0xFF) break; 

en outre, il serait peut-être une meilleure idée pour éviter les caractères signés ou, il vous devez utiliser les caractères signés, afin de les comparer avec des valeurs telles que signées -1 dans ce cas:

 
if(*p == -1) break; 

0xff == - 1 que si ces valeurs seraient affectées à un certain char (ou unsigned char) variables:

 
char a=0xff; 
char b=-1; 
if(a==b) break; 
Questions connexes