35 votes

Différence entre char et int lors de la déclaration d'un caractère

Je viens de commencer à apprendre le C et je suis assez confus quant à la déclaration des caractères en utilisant int et char.

Je sais très bien que tous les caractères sont constitués d'entiers dans le sens où les "entiers" des caractères sont les décimales ASCII respectives des caractères.

Cela dit, j'ai appris qu'il est tout à fait possible de déclarer un caractère à l'aide de int sans utiliser les décimales ASCII. Par exemple, déclarer une variable test en tant que personnage 'X' peut s'écrire comme suit :

char test = 'X';

y

int test = 'X';

Et pour les deux déclarations de caractères, les caractères de conversion sont les suivants %c (même si le test est défini comme int ).

Par conséquent, ma question est de savoir quelle(s) différence(s) il y a entre la déclaration de variables de caractère à l'aide de char y int et quand utiliser int pour déclarer une variable de type caractère ?

44voto

Serge Ballesta Points 12850

La différence est la taille en octets de la variable, et de là, les différentes valeurs que la variable peut contenir.

Un caractère doit accepter toutes les valeurs comprises entre 0 et 127 (inclus). Ainsi, dans les environnements courants, il occupe exactement un octet (8 bits). La norme ne précise pas s'il est signé (-128 - 127) ou non signé (0 - 255).

Un int doit être au moins un mot signé de 16 bits et accepter toutes les valeurs comprises entre -32767 et 32767. Cela signifie qu'un int peut accepter toutes les valeurs d'un char, que ce dernier soit signé ou non.

Si vous voulez stocker uniquement des caractères dans une variable, vous devez la déclarer comme suit char . L'utilisation d'un int ne ferait que gaspiller de la mémoire, et pourrait induire en erreur un futur lecteur. Une exception courante à cette règle est le cas où vous voulez traiter une valeur plus large pour des conditions spéciales. Par exemple, la fonction fgetc de la bibliothèque standard est déclaré comme retournant int :

int fgetc(FILE *fd);

car la valeur spéciale EOF (pour End Of File) est défini comme l'adresse de l'utilisateur. int valeur -1 (tous les bits à un dans un système à deux compléments) qui signifie plus que la taille d'un caractère. De cette façon, aucun caractère (seulement 8 bits dans un système commun) ne peut être égal à la constante EOF. Si la fonction était déclarée pour retourner un simple char rien ne permet de distinguer la valeur EOF du caractère 0xFF (valide).

C'est la raison pour laquelle le code suivant est mauvais et ne devrait jamais être utilisé :

char c;    // a terrible memory saving...
...
while ((c = fgetc(stdin)) != EOF) {   // NEVER WRITE THAT!!!
    ...
}

À l'intérieur de la boucle, un char serait suffisant, mais pour que le test ne réussisse pas lors de la lecture du caractère 0xFF, la variable doit être un int.

6voto

MicroVirus Points 1650

El char a plusieurs rôles.

La première est qu'il fait simplement partie de la chaîne des types entiers, char , short , int , long etc., ce n'est donc qu'un autre contenant pour les chiffres.

La seconde est que son stockage sous-jacent est la plus petite unité, et que tous les autres objets ont une taille qui est un multiple de la taille du char ( sizeof renvoie un nombre qui est en unités de char donc sizeof char == 1 ).

Le troisième est qu'il joue le rôle d'un caractère dans une chaîne de caractères, en tout cas historiquement. Vu comme cela, la valeur d'un char correspond à un caractère spécifié, par exemple via l'encodage ASCII, mais il peut également être utilisé avec des encodages multi-octets (un ou plusieurs char s ensemble correspondent à un caractère).

2voto

Henrik Carlqvist Points 998

En général, vous devriez déclarer les caractères comme char et utiliser int pour les entiers qui sont capables de contenir de plus grandes valeurs. Sur la plupart des systèmes, un caractère occupe un octet, soit 8 bits. En fonction de votre système, ce caractère peut être signé ou non signé par défaut, ce qui lui permet de contenir des valeurs comprises entre 0 et 255 ou entre -128 et 127.

Un int peut avoir une longueur de 32 bits, mais si vous voulez vraiment avoir exactement 32 bits pour votre entier, vous devez le déclarer comme int32_t ou uint32_t à la place.

2voto

Viktor Simkó Points 1046

Taille d'un int est de 4 octets sur la plupart des architectures, alors que la taille d'un char est de 1 octet.

1voto

cdonts Points 5920

Je pense qu'il n'y a pas de différence, mais vous allouez de la mémoire supplémentaire que vous n'allez pas utiliser. Vous pouvez aussi faire const long a = 1; mais il sera plus approprié d'utiliser const char a = 1; à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X