12
21/10/12 22:49 Programmation C/Types de base - Wikibooks Page 1 sur 12 http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base Un livre de Wikibooks. Le C est un langage typé statiquement : chaque variable, chaque constante et chaque expression, a un type défini à la compilation. Le langage lui-même fournit des types permettant de manipuler des nombres (entiers, réels ou complexes) ou des caractères (eux-mêmes étant manipulés comme des entiers spéciaux), et permet de construire des types plus complexes à partir de ces premiers, par exemple en groupant des données de même type en tableaux, ou des données de types différents dans des structures. Dans ce chapitre, nous étudierons les types de base fournis par le C, l'étude des types complexes étant faite dans la suite du livre. Entiers Il y a cinq types de variables entières (« integer » en anglais) : char ; short int, ou plus simplement short ; int ; long int, ou long ; long long int, ou long long (ce type a été ajouté depuis la norme C99). Comme évoqué en introduction, le type caractère char est particulier, et sera étudié en détail plus bas. Les types entiers peuvent prendre les modificateurs signed et unsigned qui permettent respectivement d'obtenir un type signé ou non signé. Ces modificateurs ne changent pas la taille des types. Le langage ne définit pas exactement leur tailles, mais définit un domaine de valeurs minimal pour chacun. Représentation des entiers signés La norme C tient compte des anciennes représentations des nombres signés telles que le signe+valeur absolue et le complément à 1. Ces deux représentations sont brièvement expliquées ci-dessous : Signe+valeur absolue (SVA) Un bit contient le signe du nombre (par ex: 0 pour +, 1 pour -), les autres bits sont utilisés pour la valeur absolue. On peut donc représenter 0 de deux manières : +0 (000...000) ou -0 (100..000). Sur N bits on peut donc représenter tout nombre entre -(2 N-1 -1) (111...111) et +(2 N-1 -1) (011...111). Complément à 1 (CPL1) Les bits des nombres négatifs sont inversés. On peut donc représenter 0 de deux manières : +0 (000...000) ou -0 (111..111). Sur N bits on peut donc représenter tout nombre entre -(2 N-1 -1) (100...000) et +(2 N-1 -1) (011...111). Ces deux représentations peuvent représenter la valeur nulle de deux manières différentes. La représentation moderne des nombres négatifs utilise le complément à 2 (CPL2) qui consiste à représenter les nombres négatifs comme le complément à 1 et en ajoutant 1. Sur un nombre fixe de bits, la valeur 0 n'a qu'une seule représentation : +0 (000...000) et -0 (111...111 + 1 = (1)000...000) ont deux représentations identiques. Sur N bits on peut donc représenter tout nombre entre -(2 N-1 ) (100...000) et +(2 N-

Types Debase Enc

Embed Size (px)

DESCRIPTION

Types de base

Citation preview

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 1 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    Un livre de Wikibooks.

    Le C est un langage typ statiquement : chaque variable, chaque constante et chaque expression, a un typedfini la compilation. Le langage lui-mme fournit des types permettant de manipuler des nombres(entiers, rels ou complexes) ou des caractres (eux-mmes tant manipuls comme des entiers spciaux),et permet de construire des types plus complexes partir de ces premiers, par exemple en groupant desdonnes de mme type en tableaux, ou des donnes de types diffrents dans des structures. Dans cechapitre, nous tudierons les types de base fournis par le C, l'tude des types complexes tant faite dans lasuite du livre.

    EntiersIl y a cinq types de variables entires ( integer en anglais) :

    char ;short int, ou plus simplement short ;int ;long int, ou long ;long long int, ou long long (ce type a t ajout depuis la norme C99).

    Comme voqu en introduction, le type caractre char est particulier, et sera tudi en dtail plus bas.

    Les types entiers peuvent prendre les modificateurs signed et unsigned qui permettent respectivementd'obtenir un type sign ou non sign. Ces modificateurs ne changent pas la taille des types. Le langage nedfinit pas exactement leur tailles, mais dfinit un domaine de valeurs minimal pour chacun.

    Reprsentation des entiers signsLa norme C tient compte des anciennes reprsentations des nombres signs telles que le signe+valeurabsolue et le complment 1. Ces deux reprsentations sont brivement expliques ci-dessous :

    Signe+valeur absolue (SVA)Un bit contient le signe du nombre (par ex: 0 pour +, 1 pour -), les autres bits sont utiliss pour lavaleur absolue. On peut donc reprsenter 0 de deux manires : +0 (000...000) ou -0 (100..000). Sur Nbits on peut donc reprsenter tout nombre entre -(2N-1-1) (111...111) et +(2N-1-1) (011...111).

    Complment 1 (CPL1)Les bits des nombres ngatifs sont inverss. On peut donc reprsenter 0 de deux manires : +0(000...000) ou -0 (111..111). Sur N bits on peut donc reprsenter tout nombre entre -(2N-1-1)(100...000) et +(2N-1-1) (011...111).

    Ces deux reprsentations peuvent reprsenter la valeur nulle de deux manires diffrentes.

    La reprsentation moderne des nombres ngatifs utilise le complment 2 (CPL2) qui consiste reprsenter les nombres ngatifs comme le complment 1 et en ajoutant 1. Sur un nombre fixe de bits, lavaleur 0 n'a qu'une seule reprsentation : +0 (000...000) et -0 (111...111 + 1 = (1)000...000) ont deuxreprsentations identiques. Sur N bits on peut donc reprsenter tout nombre entre -(2N-1) (100...000) et +(2N-

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 2 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    1-1) (011...111). Cette reprsentation possde donc un domaine plus large.

    Le tableau ci-dessous donne le domaine des valeurs quel que soit la reprsentation utilise (SVA, CPL1 ouCPL2) :

    Domaines de valeurs minimaux des types entiers (C90 et C99) quelle que soit sa reprsentation(SVA, CPL1 ou CPL2)

    Type Borne infrieureBorne

    infrieure(formule)

    Borne suprieureBorne

    suprieure(formule)

    signed char -127 -(27-1) +127 27-1unsigned char 0 0 +255 28-1short -32 767 -(215-1) +32 767 215-1unsigned short 0 0 +65 535 216-1int -32 767 -(215-1) +32 767 215-1unsigned int 0 0 +65 535 216-1long -2 147 483 647 -(231-1) +2 147 483 647 231-1unsigned long 0 0 +4 294 967 295 232-1

    long long (C99) -9 223 372 036 854 775 807 -(263-1) +9 223 372 036 854 775 807 263-1unsigned long long(C99) 0 0 +18 446 744 073 709 551 615 264-1

    Cette table signifie qu'un programme peut utiliser sans problme une variable de type int pour stocker lavaleur 215-1, quelque soit le compilateur ou la machine sur laquelle va tourner le programme.

    Par contre, une implmentation C peut fournir des domaines de valeurs plus larges que ceux indiqus au-dessus :

    Les domaines indiqus pour les nombres signs dans le tableau prcdent sont ceux d'une implmentationpar complment 1, ou par signe et valeur absolue. Pour le complment 2, la borne infrieure est dela forme -2N-1, ce qui autorise une valeur supplmentaire (ex: int de -215 +215-1, soit de -32 768 +32 767),un int implment sur 32 bits pourrait aller de -(231-1) 231-1, par exemple[1], et un programme tournantsur une telle implmentation peut alors utiliser ces valeurs, mais il perdrait en portabilit.

    Domaines de valeurs des types entiers reprsents en complment 2 (CPL2)

    Type Borne infrieureBorne

    infrieure(formule)

    Borne suprieureBorne

    suprieure(formule)

    signed char -128 -(27) +127 27-1unsigned char 0 0 +255 28-1

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 3 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    short -32 768 -(215) +32 767 215-1unsigned short 0 0 +65 535 216-1

    int -32 768 -(215) +32 767 215-1unsigned int 0 0 +65 535 216-1long -2 147 483 648 -(231) +2 147 483 647 231-1unsigned long 0 0 +4 294 967 295 232-1

    long long (C99) -9 223 372 036 854 775 808 -(263) +9 223 372 036 854 775 807 263-1unsigned long long(C99) 0 0 +18 446 744 073 709 551 615 264-1

    Par ailleurs, une relation d'ordre entre ces domaines de valeurs est garantie ; qui peut tre exprime ainsi :

    domaine(char) domaine(short) domaine(int) domaine(long) domaine(long long)

    Cela signifie que toutes les valeurs possibles pour une variable du type char sont aussi utilisables pour lesautres types; mais aussi que, par exemple, une valeur valide pour le type int peut ne pas tre reprsentabledans une variable de type short.

    Si vous ne savez pas quel type donner une variable de type entier, le type int est par dfaut le meilleurchoix ( condition que votre donne ne dpasse pas 215-1) : ce type est la plupart du temps reprsent auniveau matriel par un mot machine , c'est--dire qu'il est adapt la taille que la machine peut traiterdirectement (il fait usuellement 32 bits sur un PC 32 bits, par exemple). Cela permet un traitement plusrapide par le matriel. De plus, beaucoup de bibliothques (que ce soit celle fournie par le langage C oud'autres) utilisent ce type pour passer des entiers, ce qui fait que l'utilisation de ces bibliothques sera plusaise.

    Par ailleurs, un utilisateur peut connatre les domaines de valeurs exacts de sa machine en utilisant l'en-tte.

    Portabilit apporte par C99L'incertitude sur l'intervalle de valeur de chaque type en fonction de la machine peut s'avrer extrmementgnante, pour ne pas dire rdhibitoire. En effet, certains programmes peuvent ncessiter un type de donnesde taille fixe et cependant tre destins tre portables. Pour ces programmes, les types entiers du C ne sontpas suffisants. Beaucoup d'extensions ont t rajoutes pour dfinir explicitement des types entiers intervalle fixe (8, 16, 32 bits...) partir des types de base, avec une nomenclature loin d'tre homogne d'uncompilateur l'autre (ce qui, loin de rsoudre le problme, ne faisait que le dplacer).

    La norme ISO C99 dcide une bonne fois pour toute de dfinir, dans l'en-tte , plusieurs nouveauxtypes o N reprsente un nombre entier dfinissant la taille requise en bit :

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 4 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    des types implments optionnellement sur certaines architectures ( viter ?) ;entiers signs ou non et de longueur exacte : uintN_t et intN_t ;entiers pouvant contenir un pointeur : intptr_t et uintptr_t ;

    des types requis par toutes les architectures respectant la norme C99 ;entiers devant tre plus grand que N bits au moins : int_leastN_t et uint_leastN_t ;entiers rapides calculer et plus grand que N bits au moins : int_fastN_t et uint_fastN_t ;plus grand entier : intmax_t et uintmax_t.

    Cet en-tte dfinit aussi des constantes pour les valeurs minimales et maximales de chaque type.

    L'include dfinit les constantes symboliques utiliser pour imprimer ces nouveaux types avecles fonctions de la famille de printf (PRIxxx) et les lire avec celles de scanf (SCNxxx).

    Constantes numriques entiresIl existe diffrentes suites de caractres qui sont reconnues comme tant des constantes numriques entires :

    un nombre en notation dcimale : une suite de chiffres (0-9) ;le caractre 0 suivi d'un nombre en notation octale : une suite de chiffres compris entre 0 et 7 ;les caractres 0x suivi d'un nombre en notation hexadcimale : une suite de chiffres et des lettres a, b,c, d, e, f (ou A, B, C, D, E, F).

    Par dfaut, une constante numrique entire est de type int et, si sa valeur est trop grande pour le type int,elle prend celle du type plus grand suffisant. Comme les domaines de valeurs des types peuvent variersuivant la machine, le type effectif d'une constante peut lui aussi varier. Cela peut s'avrer problmatiquelors de passage de paramtres des fonctions nombre variable d'arguments, par exemple. cause de cela,il est recommand de forcer le type de la constante en le postfixant des attributs suivants :

    U : la constante est non-signe (voir la section promotion pour comprendre les implications) ;L : la constante est de type long au lieu de int ;LL est une nouveaut C99 pour les constantes de type long long.

    U peut tre combin L et LL pour obtenir les types unsigned long et unsigned long long,respectivement. Lorsqu'une constante est suffixe, mais que sa valeur est trop grande pour le type demand,le mme processus de recherche de type assez grand est utilis[2].

    DbordementSur une machine donne, un type entier a un domaine de valeurs fixe. Considrons qu'on travaille sur un PCen 32 bits, en complment 2 : sur un tel ordinateur, le type int varie souvent de -231 231-1. Cela permetde manipuler sans problme des valeurs dans ce domaine. Par contre, si on utilise des valeurs hors dudomaine, par exemple 232, et qu'on essaye de la stocker dans une variable de type int sur une telle machine,que se passe-t-il ?

    La rponse dpend du type:

    Si on essaye d'enregistrer une valeur hors domaine dans une variable de type sign (comme dansl'exemple), la conversion n'est pas dfinie par le langage. Cela signifie que tout peut arriver.Si on essaye d'enregistrer une valeur hors domaine dans une variable de type non sign (unsigned long,

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 5 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    par exemple), la conversion se fait modulo la valeur maximale reprsentable par ce type + 1.

    Exemples : On suppose que le type unsigned char est cod sur 8 bits. Alors une valeur de ce type peut allerde 0 28-1, soit 255. Par la rgle prcdente, les conversions se feront donc modulo 255 + 1, soit 256. Onconsidre le programme suivant :

    #include int main(void){ unsigned char c = 300; /* %hhu sert dire printf() qu'on veut afficher un unsigned char */ printf("La variable c vaut %hhu.\n", c); c = -5; printf("La variable c vaut %hhu.\n", c); return 0;}

    Le rsultat du programme est :

    La variable c vaut 44.La variable c vaut 251.

    En effet, on a 300 - 256 = 44 et -5 + 256 = 251.

    De mme :

    #include int main(void){ signed char c = 300; /* %hhd sert dire printf() qu'on veut afficher un signed char */ printf("La variable c vaut %hhd.\n", c); c = -300; printf("La variable c vaut %hhd.\n", c); return 0;}

    Le rsultat du programme peut alors tre :

    La variable c vaut 44.La variable c vaut -44.

    Sur une telle machine, les types signs sont traits de la mme manire que les types non signs.

    Si vous essayez de compiler ces deux programmes, votre compilateur pourra dtecter les dbordements etvous en avertir (GCC le fait).

    Rels

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 6 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    Les rels sont approxims par des nombres virgule flottante. Comme dans le cas des entiers, il existeplusieurs types de nombre virgule flottante. En voici la liste trie par prcision croissante :

    float ;double ;long double.

    La norme C90 tait assez floue concernant les nombres virgule flottante, leurs reprsentations, la prcisiondes oprations, etc., ce qui fait que c'tait un des domaines o la conception de programmes utilisant lesnombres flottants tait chose peu aise. Le C99 a clarifi les choses en prcisant qu'une implmentation Cdevait respecter la norme IEC 60559:1989 Arithmtique binaire en virgule flottante pour systmes microprocesseur. Cette norme (drive de IEEE 754) dfinit des formats de donnes pour les nombres virgule flottante, ainsi que des oprations et fonctions sur ces nombres. Elle garantit, entre autres :

    que certains types de donnes auront toujours le mme format ;et que les calculs effectus sur un type de donne donneront toujours le mme rsultat.

    Elle dfinit de plus comment sont grs les cas exceptionnels, comme les infinis, les NaN (pour Not aNumber, rsultant par exemple de la division 0/0), etc.

    Les types flottants du C correspondent aux type IEC 60559 de la manire suivante :

    float : simple prcisiondouble : double prcisionlong double : suivant l'implmentation, soit la double prcision tendue, soit un type non-IEC 60559 (maisde prcision au moins gale double), soit double prcision.

    Constantes rellesUne suite de caractres reprsente une constante virgule flottante si :

    c'est une suite de chiffres spare par un caractre point , cette sparation pouvant s'effectuer n'importe quel endroit de la suite (0.0, .0 et 0. reprsentent tous les trois la valeur 0 de type double) ;un nombre suivi d'un caractre e suivi d'un entier.

    Dans le deuxime cas, le nombre peut tre soit un entier, soit un rel du premier cas.

    Les constantes sont de type double par dfaut. Pour demander le type float, il faut la suffixer par f ou F, etpour le type long double par l ou L.

    ArithmtiqueUne attention particulire doit tre porte sur la prcision des types rels. Ces diffrents types ne fontqu'approximer l'ensemble des nombres rels, avec une prcision finie. Des erreurs d'arrondis sont prvoir,ce qui est trs problmatique pour des domaines qui n'en tolrent pas (notamment pour les applicationsfinancires, il est conseill de ne pas utiliser de calcul en virgule flottante).

    Le type float en particulier a une prcision minimale, qui est bien souvent insuffisante. Voici un exempleclassique d'erreur ne pas faire qui illustre les problmes lis la prcision des types flottants :

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 7 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    #include int main(void){ float i = 0; int j; for (j = 0; j < 1000; j ++) { i += 0.1; } printf("i = %f\n", i); return 0;}

    Le rsultat est 99,999046, ce qui montre que la prcision du type float est en gnral mauvaise, d'autantplus que le nombre 0,1 n'est pas reprsentable de manire exacte en binaire[3]. Il est ainsi conseill d'utiliserle type double la place de float autant que possible. Dans ce cas de figure, il est prfrable d'viter lesaccumulations d'erreurs infinitsimales, en rcrivant le code de la manire suivante :

    #include int main(void){ float i; int j; for (j = 0; j < 1000; j++) { i = j * 0.1; } printf("i = %f\n", i); return 0;}

    C'est probablement plus coteux, car on effectue un millier de multiplications au lieu d'un millierd'additions, mais cela permet d'avoir une prcision nettement meilleure que le code prcdent.

    Pour plus d'informations sur ce domaine, un wikilivre Arithmtique flottante est disponible.

    CaractresLe type permettant de reprsenter un caractre est char. Ce type est un peu plus particulier que les autres,d'une part parce que sa taille dfinit l'unit de calcul pour les quantits de mmoire (et donc pour les taillesdes autres types du langage) et d'autre part son domaine de valeur peut grandement varier de manirerelativement inattendue.

    Par dfinition, la taille du type char, note sizeof(char), vaut toujours 1. Cependant, il faut faire attention :contrairement ce qu'on pense souvent, un char au sens du C ne vaut pas toujours un octet. Il occupera auminimum 8 bits, mais il existe des architectures, relativement spcialises il est vrai, ayant des char de 9bits, de 16 bits, voire plus. Mme si, dans une large majorit des cas, les compilateurs utilisent des char de 8bits, la fois par simplicit (les machines modernes fonctionnent gnralement en 8, 16, 32 ou 64 bits) etpour viter des problmes de portabilit de code (beaucoup de codes C existants reposent sur l'hypothse queles char font 8 bits, et risqueraient de ne pas marcher sur une telle architecture)[4]. Par simplification, nousutiliserons donc le terme octet la plupart du temps dans la suite de ce wikilivre.

    Un autre pige de ce type est qu'il peut tre de base signed ou unsigned, au choix du compilateur, ce qui

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 8 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    peut s'avrer dangereux. Considrez le code suivant :

    /* Ce code peut ne pas fonctionner avec certains compilateurs */char i;for (i = 100; i >= 0; i --){ /* ... */}

    Dans cet exemple, l'instruction for permet de faire itrer les valeurs entires de i de 100 0, incluses. Onpourrait navement penser optimiser en utilisant un type char. Sauf que si ce type est implicitementunsigned, la condition i >= 0 sera toujours vraie, et tout ce que vous obtiendrez est une boucle infinie.Normalement, tout bon compilateur devrait vous avertir que la condition est toujours vraie et donc vouspermettre de corriger en consquence, plutt que perdre des heures en dbugage.

    Constantes reprsentant un caractreUne constante reprsentant un caractre est dlimite par des apostrophes, comme par exemple 'a'. En faitpour le C, les caractres ne sont ni plus ni moins que des nombres entiers (ils sont de type int, mais leurvaleur tiendra dans un type char), les deux tant parfaitement interchangeables. Il est tout fait autorisd'crire 'a' * 2 ou 'a' - 32. La valeur reprsente par cette constante est nanmoins dpendante dusystme, mme si dans une crasante majorit des cas, on se retrouvera avec un jeu de caractres compatibleavec ASCII, qui dfinit prcisment les glyphes des caractres de 0 127[5]. Cet ensemble est peinesuffisant pour couvrir certaines langues latines, seule optique vise l'poque o il a t dfini, si bien quede nombreuses extensions sont par la suite apparues.

    Par exemple le caractre (ligature du o et du e) a pour valeur :

    189 dans le jeu de caractres ISO-8859-15 (principalement utilis pour les langues latines d'Europe) ;156 sur certaines variantes du jeu de caractres Windows 1252 ;0xc593 (deux octets) si votre diteur de texte utilise l'UTF-8 ;207 avec l'encodage Mac Roman (Mac OS 9 et antrieur) ;Et n'a pas d'quivalent en ISO-8859-1 (le caractre 189 est le symbole ! , le 207 est le et le 156n'est pas utilis).

    Il s'agit en fait d'un cas particulier d'un sujet trs vaste, qui porte le nom d'internationalisation. Le langage Creste relativement agnostique ce niveau : les caractres sont des nombres et les chanes, une simple suite decaractres termine par 0. Au systme d'interprter les nombres comme il se doit.

    Un petit exemple :

    #include int main(void){ printf("Sur votre machine, la lettre 'a' a pour code %d.\n", 'a'); return 0;}

    Le programme prcdent donnera le rsultat suivant sur une telle machine :

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 9 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    Sur votre machine, la lettre 'a' a pour code 97.

    Caractres spciauxIl existe certaines constantes caractres aux significations particulires :

    Constante Caractre'\'' une apostrophe'\"' un guillemet'\?' un point d'interrogation'\\' un backslash'\a' un signal sonore (ou visuel)'\b' un espace arrire'\f' saut au dbut de la page suivante'\n' saut de ligne'\r' un retour chariot'\t' une tabulation'\v' une tabulation verticale

    De plus, on peut crire n'importe quelle valeur de caractre avec les expressions suivantes :

    '\xHH', o chaque H reprsente un chiffre hexadcimal correspondant au code du caractre. Par exemple,'\x61' reprsente le caractre 'a' (minuscule) en ASCII (car 97 = 6 * 16 + 1) ;'\oOO', o chaque O reprsente un chiffre octal correspondant au code du caractre.

    TrigrapheCette fonctionnalit obscure et peu employe est en gnral viter, car trs souvent inutile, et peut causerdes bugs incomprhensibles au programmeur non averti. Nanmoins, de trs rares programmes peuventutiliser ce genre de fonctionnalits. Un trigraphe est simplement une suite de trois caractres dans le codesource qui sera remplace par un seul ; cette fonctionnalit a t ajoute au C pour supporter lesarchitectures dont l'alphabet ne dispose pas de certains caractres qui sont ncessaires dans la syntaxe du C,comme les dises ou les accolades.

    Les substitutions suivantes sont faites partout dans le code source (y compris les chanes de caractres) :

    Trigraphe Caractre??= #

    ??( [

    ??) ]

    ??< {

    ??> }

    ??/ \

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 10 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    ??/ \

    ??' ^

    ??! |

    ??- ~

    Voici une manire de rendre illisible un programme utilisant les trigraphes :

    ??=include int main(void)??< puts("Bonjour !"); return 0;??>

    Par dfaut, la plupart des compilateurs dsactivent les trigraphes, au cas o vous ne seriez pas encoredissuad de les utiliser.

    Chane de caractresUne chane de caractre, comme son nom l'indique, est une suite de caractres avec la particularit d'avoirun caractre nul (0) la fin. Une chane de caractre est en fait implmente en C avec un tableau de typechar.

    Sous sa forme la plus simple, on dclare une chane comme une suite de caractres entre guillemets (doublequote) :

    "Ceci est une chane de caractre";""; /* Chane vide */

    Si la chane est trop longue, on peut aussi la couper sur plusieurs lignes :

    "Ceci est une chane de caractre, " /* pas de ; */"dclare sur plusieurs lignes.";

    Deux chanes ctes ctes (modulo les espaces et les commentaires) seront concatnes par le compilateur.De plus on peut utiliser le caractre barre oblique inverse (\) pour annuler la signification spciale de certainscaractres ou utiliser des caractres spciaux (C.f liste ci-dessus).

    "Une chane avec des \"guillemets\" et une barre oblique (\\)\n";

    Il est aussi possible d'utiliser la notation hexadcimale et octale pour dcrire des caractres dans la chane, ilfaut nanmoins faire attention avec la notation hexadcimale, car la dfinition peut s'tendre sur plus de 2caractres. En fait, tous les caractres suivant le \x et appartenant l'ensemble "0123456789abcdefABCDEF"seront utiliss pour dterminer la valeur du caractre (du fait que les caractres d'une chane peuvent faireplus qu'un octet). Cela peut produire certains effets de bords comme :

    /* Ce code contient un effet de bord inattendu */"\x00abcdefghijklmnopqrstuvzxyz"

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 11 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    Ce code n'insrera pas un caractre 0 au dbut de la chaine, mais toute la squence "\x00abcdef" servira calculer la valeur du caractre (mme si le rsultat sera tronqu pour tenir dans un type char). On peut vitercela en utilisant la concatnation de chanes constantes :

    "\x00" "abcdefghijklmnopqrstuvzxyz"

    Enfin, les chanes de caractres faisant appel aux concepts de pointeur, tableau et de zone mmoire statique,leur utilisation plus pousse sera dcrite dans la section ddie aux tableaux.

    noter la reprsentation obsolte des chanes de caractres multilignes. viter dans la mesure dupossible :

    /* Ce code est obsolete et a eviter */"Ceci est une chane de caractre,\dclare sur plusieurs lignes";

    BoolensLe langage (jusqu' la norme C99) ne fournit pas de type boolen. La valeur entire 0 prend la valeur devrit faux et toutes les autres valeurs entires prennent la valeur de vrit vrai.

    La norme C99 a introduit le type _Bool, qui peut contenir les valeurs 0 et 1. Elle a aussi ajout l'en-tte, qui dfinit le type bool qui est un raccourci pour _Bool, et les valeurs true et false[6].Nanmoins, ces nouveauts du C99 ne sont pas trs utilises, les habitudes ayant t prises d'utiliser 0 etdiffrent de zro pour les boolens en C.

    Nota : toute expression utilisant des oprateurs boolens (voir oprateurs), retourne 1 si l'expression estvraie et 0 si elle est fausse, ce qui rend quasiment inutile l'usage du type boolen.

    VideEn plus de ces types, le langage C fournit un autre type, void qui reprsente rien, le vide. Il n'est paspossible de dclarer une variable de type void. Nous verrons l'utilit de ce type lorsque nous parlerons defonctions et de pointeurs.

    Notes1. ! La norme C contraint les domaines de valeurs des types signs entre -(2N-1-1) et 2N-1-1, o N est un

    entier quelconque, et les types non signs entre 0 et 2N-1.2. ! La liste des types successifs utiliss pour dterminer le type d'une constante entire a chang entre

    C90 et C99. Cela n'a, quasiment tout le temps, aucune incidence, sauf pour le cas d'une constante devaleur trop grande pour le type long : en C90, le type unsigned long est utilis, alors qu'en C99 letype long long sera utilis. Une telle valeur sera alors signe dans un cas, et non signe dans l'autre.Dans ce cas, utiliser un suffixe adapt (UL, LL ou ULL) permet de s'assurer du type de la constante.

  • 21/10/12 22:49Programmation C/Types de base - Wikibooks

    Page 12 sur 12http://fr.wikibooks.org/wiki/Programmation_C/Types_de_base

    3. ! 0,110 = 0.0001100110011...24. ! La confusion est surtout ne de l'utilisation du mot byte pour dsigner la taille du type char dans la

    norme, alors que ce mot est utilis dans presque tous les autres domaines de l'informatique pourdsigner un octet.

    5. ! En-dehors des encodages compatibles avec ASCII, on ne rencontre gure en pratique que la famillede jeux de caractres EBCDIC, utilise sur des systmes IBM et quelques mainframes.

    6. ! Ces trois expressions sont dfinies sous formes de macro pour le prprocesseur.

    Rcupre de http://fr.wikibooks.org/w/index.php?title=Programmation_C/Types_de_base&oldid=387649 Dernire modification de cette page le 23 septembre 2012 20:26.Les textes sont disponibles sous licence Creative Commons attribution partage lidentique ; dautrestermes peuvent sappliquer.Voyez les termes dutilisation pour plus de dtails.