2017-09-14 1 views
-1

Je vais avoir du mal à comprendre pourquoi je reçois cet avertissement de compilation en utilisant GCC 4.8.4 sur Linux:avertissement GCC « comparaison est toujours vrai » lorsque l'on compare le retour de ntohs avec un entier

avertissement: comparaison est toujours vrai en raison de gamme limitée de type de données [-wtype_avertissement limites]

lorsque l'on compare les valeurs comme celles-ci:

uint16_t port_number = 23620; 

if (ntohs(port_number) >= 0 && ntohs(port_number) <= 1023) { 
    puts("The compiler warns that I will always end up here."); 
} else { 
    puts("Not reached"); 
} 

Je comprends que le pr oblem est dû à la taille maximale supportée par chaque valeur impliquée dans cette comparaison. Mais comment puis-je mieux comprendre et résoudre le problème?

+5

Il est seulement le '> = 0' qui déclenche l'avertissement, puisque' uint16_t' est non signé et donc toujours non négatif. – ecatmur

+0

Lire les pages de manuel des fonctions est toujours une bonne idée avant de demander. – Olaf

+0

@Olaf pouvez-vous me dire où dans la page de manuel de cette fonction il y a une information qui pourrait m'aider? Parce que je n'ai rien trouvé d'utile là-bas qui soit lié à ma question ... Outre le uint16_t. –

Répondre

4

ntohs retourne un uint16_t. Puisque uint16_t est non signé, il sera toujours supérieur ou égal à 0. Par conséquent, ntohs(port_number) >= 0 résout toujours à true. C'est pourquoi vous recevez l'avertissement.