1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2011
    Messages : 2
    Points : 2
    Points
    2

    Par défaut Quelles sont les différences entre les types char et int ?

    Bonjour,

    Après avoir cherché obstinément une réponse à ma question, je dois me résoudre à la poser dans ce forum étant donné qu'aucune ne m'a pleinement satisfait. Pour mieux vous faire comprendre, voici les deux bouts de codes qui ont suscité mes interrogations :

    _______________
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    int lettre = 'b';
    printf("%c", lettre);
    return 0;
    }
    ________________
    #include <stdio.h>
    #include <stdlib.h>


    int main()
    {
    char lettre = 98;
    printf("%c", lettre);
    return 0;
    }
    ________________

    Je crois qu'il est inutile de préciser que la compilation des deux codes donnent le même résultat, à savoir l'affichage du caractère 'b'. Cela vient sans doute du fait que le représentation binaire des deux variables est identique. Mais ce qui me turlupine, c'est de ne pas savoir pourquoi avoir crée deux variables alors que les deux remplissent dans tous mes exemples les mêmes fonctions. Je crois qu'elle réside dans la taille (1 octet pour char et de 2 à 4 octets pour int), et que son utilisation est un gage de lisibilité et d'économie, mais je ne suis pas sûr.

    Je demande à tous les éclairés de bien vouloir me démystifier la différence de comportement de ces deux types, et si le cas se présente, me donner un exemple où leur remplacement est impossible. Merci !

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    juin 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 2 131
    Points : 4 330
    Points
    4 330

    Par défaut

    Citation Envoyé par RayBradbury Voir le message
    Je crois qu'elle réside dans la taille (1 octet pour char et de 2 à 4 octets pour int)
    Oui c'est une différence. Enfin pour être totalement précis, la différence se situe dans la plage minimale garantie de chacun des types

    Parmi les autres différences, un int (sans qualificateur signed/unsigned) est signé alors qu'un char peut être signé ou non suivant l'implémentation.

    Au passage :
    • La norme ne donne que des plages de valeur garanties, pas de taille.
    • Un char peut avoir une taille supérieure à un octet.
    • Dans tous les cas sizeof(char) == 1 (mais l'unité n'est pas l'octet). C'est la définition.
    • Un int peut avoir une taille différente de 2 ou 4 octets.


    Citation Envoyé par RayBradbury Voir le message
    et que son utilisation est un gage de lisibilité et d'économie, mais je ne suis pas sûr.
    C'est plus compliqué que ça.

    En C, une chaîne de caractère est représentée par un tableau de char terminé par un \0 et toutes les fonctions manipulant des chaînes de caractères (strcpy, strlen, ...) travaillent avec des char*.

    Par contre une valeur du style 'b' est en C de type int (précision au passage, en C++ elle serait de type char) et les fonctions qui manipulent/retournent des caractères isolés (getchar, toupper, ...) utilisent des int (ne serait-ce que pour gérer EOF).

    Citation Envoyé par RayBradbury Voir le message
    et si le cas se présente, me donner un exemple où leur remplacement est impossible. Merci !
    Tout simplement

    ici tu ne peux pas utiliser, de manière portable (mais cela peut fonctionner sur certaines implémentations), un char.

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : janvier 2006
    Messages : 3 656
    Points : 8 231
    Points
    8 231

    Par défaut

    1. Tout d'abord, int est synonyme de signed int alors que char désigne, suivant le compilateur, signed char ou unsigned char.

    2. La taille d'un char est de un octet, celle d'un int généralement de 2 ou 4 octets.

    3. En langage C, là où on dit qu'on attend un "caractère" ('A', 'b', '+', etc.), on attend en réalité un "unsigned char". Si l'on n'utilise que le jeu de caractères de base (ce qui correspond aux caractères ASCII dans la pluprat des systèmes qui nous sont familiers), on peut utiliser simplement "char" plutôt que "unsigned char" pour représenter nos caractères car il est garanti que le signe de ces caractères sera toujours positif que l'on décide des les interpréter comme des signed char ou comme des unsigned char, ce qui signifie que signed ou unsigned ne changera absolument rien. Par exemple, 01100010 se lira toujours 98 que l'on décide de l'interpréter comme un signed char ou comme un unsigned char.

    Ainsi, avec le code que tu as posté, tu peux en effet indifférement utiliser char ou int, voire short ou long si tu veux, vu que l'entier 98 (que l'on peut aussi écrire 0x62, 0142 ou encore 'b') peut se représenter à l'aide d'un de ces types.

    Si on voulait par contre afficher une chaîne de caractères au lieu d'un seul caractère, on a alors cette fois-ci bel et bien besoin d'une suite de char et non de int. Ainsi le code immédiatement ci-dessous affiche bien "abc", tandis que le second réserve des surprises car la chaîne qu'il faut afficher est 01100001 01100010 01100011 00000000 alors le tableau du deuxième code contient autre chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char texte[] = {97, 98, 99, 0}; /* ou {'a', 'b', 'c', '\0'} */
    printf("%s\n", texte);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int texte[] = {'a', 'b', 'c', '\0'}; /* ou {97, 98, 99, 0} */
    printf("%s\n", texte);
    Dans cet exemple donc, c'est obligatoirement char qu'il fallait utiliser, pas autre chose.

    Pour mettre 2011 dans une variable par contre, on choisira certainement tout sauf char ...

    La FAQ pourra aussi te donner quelques inos utiles.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2011
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    Merci maintes fois pour vos aides, ça m'a considérablement aidé.
    Problème résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelle est la différence entre les sections critiques et les mutex ?
    Par blueLight dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 28/05/2010, 23h33
  2. Réponses: 0
    Dernier message: 05/06/2009, 13h04
  3. Réponses: 8
    Dernier message: 17/05/2006, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo