2016-07-25 1 views
4

Je trouve la valeur maximale d'un char par simple addition et de test lorsque le nombre devient négatif:trouver de la valeur maximum de caractère dans C

#include<stdio.h> 

/*find max value of char by adding*/ 
int main(){ 
    char c = 1; 

    while(c + 1 > 0) 
    ++c; 

    printf("Max c = %d\n",(int)c); /*outputs Max c = -128*/ 
    return 0; 
} 

Les tests en boucle while avance, donc la première fois c+1 est négatif il casse et nous imprimons la valeur de c. Cependant, la programmation produit le nombre négatif!

Pourquoi pas cette sortie de programme 127?

+0

Je voudrais utiliser limits.h pour cela. Mais si vous insistez, utilisez int comme contre et de le comparer avec le compteur en tant que char 'casted c! = (Char) C' – KIIV

Répondre

4

Il y a un casting implicite se produisant dans le tout conditionnel qui est à l'origine de la comparaison de travailler sur ints plutôt que les caractères.

Si vous changez à

while((char)(c + 1) > 0) 
    ++c; 

il imprimera 127.

+4

Correct ... sauf que je pense que la terminologie correcte serait « la promotion entière », et non « cast implicite ». ..? – phonetagger

+1

@phonetagger Merci pour le commentaire. Ma compréhension est que la promotion d'entier est un cas spécifique de casting implicite, donc les deux termes sont techniquement corrects. – bgoldst

+1

La "promotion d'entier" est consultable, au cas où quelqu'un voudrait en savoir plus à ce sujet – anatolyg

0

Signed integer overflow is undefined behavior. Cela signifie qu'un compilateur conforme C est autorisé à changer c + 1 > 0 à true, car l'ajout « ne peut pas » trop-plein.

Cela signifie que votre programme peut légitimement être compilé en une boucle sans fin.

+0

Bien que cela puisse être vrai, cela n'explique pas le comportement observé par l'OP. – phonetagger

+0

Ceci est seulement indéfini si 'INT_MAX == CHAR_MAX'. – EOF

+1

@EOF - Je ne suis pas sûr que ce soit vrai. Le côté droit de l'expression 'c + 1' est de type' int' et son côté gauche est un type plus petit, donc le résultat entier de cette expression est un 'int'. Donc la comparaison 'c + 1> 0' est un' int' comparé à zéro (un autre 'int', mais un spécial). – phonetagger