2010-11-08 23 views
3

Le code suivant:évaluation de l'état étrange

#include <stdint.h> 

int main() { 
    uint8_t Byte; 

    if (Byte < 0) { } 
} 

émet l'avertissement de compilation suivante:

main.cpp: In function `int main()': 
main.cpp:6: warning: comparison is always false due to limited range of data type 

C'est très bien. Mais quand je change condition:

(1) if (true || (Byte < 0)) { } 

Je reçois encore l'avertissement, alors que je pense recevoir d'avertissement comme « la comparaison est toujours vrai ... » :)

Si je change déclaration d'octets à:

L'avertissement

disparaît.

Comment puis-je expliquer le comportement?

Mon système est RHEL 5.3 64 bits livré avec gcc 4.1.2.

EDIT:

(1) n'est pas un problème, je viens juste mal compris avertissement du compilateur. Il ne dit pas que le tout est faux mais plutôt "Octet < 0".

Donc le problème est seulement (2) - pourquoi Byte type déclenche l'avertissement du compilateur. La constante "0" est de type int, donc ses 4 octets. Donc, il doit être lié à la comparaison si uint8_t avec int

Répondre

1

Lorsque vous comparez une valeur non signée à votre int signé 0, la valeur est d'abord (implicitement) transtypée en un int. Comme un uint8_t est compris entre 0 et 255, il est positif lorsqu'il est converti en un int de 32 bits. D'autre part, vous uint32_t est entre 0 et 2^32-1, donc lorsqu'il est converti en un entier de 32 bits, il peut envelopper et devenir négatif (toutes les valeurs supérieures ou égales à 2^31 seront jeté en valeurs int négatives, en fait). Donc, votre comparaison n'est pas toujours vraie, et le compilateur a raison.