« Programmation C/Types de base » : différence entre les versions
Contenu supprimé Contenu ajouté
m →Entiers : singulier/pluriel |
m Formatage, ajout de code |
||
Ligne 4 :
== Entiers ==
Il y a cinq types de variables entières (« integer » en anglais) :
*<
*<
*<
*<
*<
Comme évoqué en introduction, le type caractère <
Les types entiers peuvent prendre les modificateurs <
=== Représentation des entiers signés ===
Ligne 34 :
! Borne supérieure (formule)
|-
| bgcolor="#F9F9F9" |<
| ≥ 8 bits
| style="background-color:#FFFFFF; text-align: right;" |-128
Ligne 41 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>7</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| ≥ 8 bits
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 48 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>8</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| ≥ 16 bits
| style="background-color:#FFFFFF; text-align: right;" |{{formatnum:-32768}}
Ligne 55 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>15</sup>-1
|-
| bgcolor="#F9F9F9" |<
| ≥ 16 bits
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 62 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>16</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| ≥ 16 bits
| style="background-color:#FFFFFF; text-align: right;" |{{formatnum:-32768}}
Ligne 69 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>15</sup>-1
|-
| bgcolor="#F9F9F9" |<
| ≥ 16 bits
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 76 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>16</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| ≥ 32 bits
| style="background-color:#FFFFFF; text-align: right;" |{{formatnum:-2147483647}}
Ligne 83 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>31</sup>-1
|-
| bgcolor="#F9F9F9" |<
| ≥ 32 bits
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 90 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>32</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| ≥ 64 bits
| style="background-color:#FFFFFF; text-align: right;" |{{formatnum:-9223372036854775807}}
Ligne 97 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>63</sup>-1
|-
| bgcolor="#F9F9F9" |<
| ≥ 64 bits
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 105 :
|}
Cette table signifie qu'un programme peut utiliser sans problème une variable de type <
Par contre, une implémentation C <em>peut</em> fournir des domaines de valeurs plus larges que ceux indiqués au-dessus :
* Les domaines indiqués pour les nombres signés dans le tableau précédent sont ceux d'une implémentation par '''complément à 1''', ou par '''signe et valeur absolue'''. Pour '''le complément à 2''', la borne inférieure est de la forme -2<sup>N-1</sup>, ce qui autorise une valeur supplémentaire (ex : <
* un <
{| class="wikitable"
Ligne 119 :
! Borne supérieure (formule)
|-
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |-128
| style="background-color:#FFFFFF; text-align: right;" |-(2<sup>7</sup>)
Ligne 125 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>7</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |0
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 131 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>8</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |-{{formatnum:32768}}
| style="background-color:#FFFFFF; text-align: right;" |-(2<sup>15</sup>)
Ligne 137 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>15</sup>-1
|-
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |0
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 143 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>16</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |-{{formatnum:32768}}
| style="background-color:#FFFFFF; text-align: right;" |-(2<sup>15</sup>)
Ligne 149 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>15</sup>-1
|-
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |0
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 155 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>16</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |-{{formatnum:2147483648}}
| style="background-color:#FFFFFF; text-align: right;" |-(2<sup>31</sup>)
Ligne 161 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>31</sup>-1
|-
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |0
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 167 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>32</sup>-1
|-----
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |-{{formatnum:9223372036854775808}}
| style="background-color:#FFFFFF; text-align: right;" |-(2<sup>63</sup>)
Ligne 173 :
| style="background-color:#FFFFFF; text-align: right;" |2<sup>63</sup>-1
|-
| bgcolor="#F9F9F9" |<
| style="background-color:#FFFFFF; text-align: right;" |0
| style="background-color:#FFFFFF; text-align: right;" |0
Ligne 183 :
domaine(char) ≤ domaine(short) ≤ domaine(int) ≤ domaine(long) ≤ domaine(long long)
Cela signifie que toutes les valeurs possibles pour une variable du type <
Si vous ne savez pas quel type donner à une variable de type entier, le type <
Par ailleurs, un utilisateur peut connaître les domaines de valeurs exacts de sa machine en utilisant l'en-tête <code><limits.h></code>.
Ligne 193 :
L'incertitude sur l'intervalle de valeur de chaque type en fonction de la machine peut s'avérer extrêmement gênante, pour ne pas dire rédhibitoire. En effet, certains programmes peuvent nécessiter un type de données de taille fixe et cependant être destinés à être portables. Pour ces programmes, les types entiers du C ne sont pas suffisants. ''Beaucoup'' d'extensions ont été rajoutées pour définir explicitement des types entiers à intervalle fixe (8, 16, 32 bits...) à partir des types de base, avec une nomenclature loin d'être homogène d'un compilateur à l'autre (ce qui, loin de résoudre le problème, ne faisait que le déplacer).
La norme ISO C99 décide une bonne fois pour toute de définir, dans l'en-tête [[w:en:stdint.h|<stdint.h>]], plusieurs nouveaux types où <
* des types implémentés optionnellement sur certaines architectures (à éviter ?) ;
** entiers signés ou non et de longueur ''N'' exacte : <
** entiers pouvant contenir un pointeur : <
* des types requis par toutes les architectures respectant la norme C99 ;
** entiers devant être plus grand que ''N'' bits au moins : <
** entiers rapides à calculer et plus grand que ''N'' bits au moins : <
** plus grand entier : <
Cet en-tête définit aussi des constantes pour les valeurs minimales et maximales de chaque type.
Ligne 214 :
Par défaut, une constante numérique entière est de type <code>int</code> et, si sa valeur est trop grande pour le type <code>int</code>, elle prend celle du type « plus grand » suffisant. Comme les domaines de valeurs des types peuvent varier suivant la machine, le type effectif d'une constante peut lui aussi varier. Cela peut s'avérer problématique lors de passage de paramètres à 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 :
* <
* <
* <
<
=== Débordement ===
Sur une machine donnée, un type entier a un domaine de valeurs fixe. Considérons qu'on travaille sur un PC en 32 bits, en complément à deux : sur un tel ordinateur, le type <
La réponse dépend du type:
* Si on essaye d'enregistrer une valeur hors domaine dans une variable de type ''signé'' (comme dans l'exemple), la conversion n'est pas définie 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é'' (<
Exemples : On suppose que le type <
<source lang="c" line="1">
Ligne 288 :
=== Constantes réelles ===
Une suite de caractères représente une constante à virgule flottante si :
*c'est une suite de chiffres séparée par un caractère « point », cette séparation pouvant s'effectuer à n'importe quel endroit de la suite (<code>0.0</code>, <code>.0</code> et <code>0.</code> représentent tous les trois la valeur 0 de type <
*un ''nombre'' suivi d'un caractère « e » suivi d'un entier.
Dans le deuxième cas, le ''nombre'' peut être soit un entier, soit un réel du premier cas.
Ligne 405 :
| style="background:#ECE5CA; text-align:center; font-weight:bold;" |Caractère
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |une apostrophe
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un guillemet
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un point d'interrogation
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un backslash
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un signal sonore (ou visuel)
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un espace arrière
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |saut au début de la page suivante
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |saut de ligne
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |un retour chariot
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |une tabulation (pose problème avec gcc-4.8)
|-
| bgcolor="#EAF5FB" |<
| bgcolor="#FAF9EC" |une tabulation verticale (pose problème avec gcc-4.8)
|}
De plus, on peut écrire n'importe quelle valeur de caractère avec les expressions suivantes :
*<
*<
*<
=== Trigraphe ===
Ligne 456 :
! Caractère
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|-
|<
|<
|}
Voici une manière de rendre illisible un programme utilisant les trigraphes :
|