© Éditions Eyrolles
217
chapitre n° 13
Les possibilités du langage C proches de la machine
1.2 Prise en compte d’un attribut de signe
Ce que nous venons d’exposer s’applique, en C, aux types short, int et long (avec différents nombres de bits). Mais le langage C vous autorise à définir trois autres types voisins des
précédents en utilisant le qualificatif unsigned. Dans ce cas, on ne représente plus que des
nombres positifs pour lesquels aucun bit de signe n’est nécessaire. Cela permet de doubler la
taille des nombres représentables ; par exemple, avec 16 bits, on passe de l’intervalle [-32768;
32767] à l’intervalle [0 ; 65535].
Toutefois, il ne faut pas perdre de vue que la notion de type n’est pas intrinsèque, autrement
dit, lorsqu’on voit un motif binaire donné, on ne peut pas lui attribuer de valeur précise, tant
qu’on ne sait pas comment il a été codé. Précisément, à un entier de 16 bits on pourra attribuer
deux valeurs différentes, suivant qu’on le considère comme « signé » ou « non signé ». Par
exemple, 1111111111111111 vaut -1 quand on le considère comme signé et 65535 quand
on le considère comme non signé.
D’une manière similaire, avec printf ("%u", n) on obtiendra (n étant le même dans les
deux cas) une valeur différente de celle fournie par printf ("%d", n) ; en effet, rappelons
que la fonction printf n’a plus connaissance du type exact des valeurs qu’elle reçoit et que
seul le code de format lui permet d’effectuer le « bon décodage ».
1.3 Extension des règles de conversions
Tant qu’une expression ne mélange pas des types signés et des types non signés, les choses
restent naturelles. Il suffit simplement de compléter les conversions short -> int -> long
par les conversions unsigned short -> unsigned int -> unsigned long, mais
aucun problème nouveau ne se pose (on peut, certes, toujours obtenir des dépassements de
capacité qui ne seront pas détectés).
En revanche, le mélange des types signés et des types non signés est (hélas !) accepté par le
langage ; mais il conduit à mettre en place des conversions (généralement de signé vers non
signé) n’ayant guère de sens et ne respectant pas, de toute façon, l’intégrité des données (que
pourrait d’ailleurs bien valoir -5 converti en non signé ?). Une telle liberté est donc à proscrire.
À simple titre indicatif, sachez que les conversions prévues par la norme, dans ce cas, se contentent
de préserver le motif binaire (par exemple, la conversion de signed int en unsigned int
revient à conserver tel quel le motif binaire concerné).
La même remarque prévaut pour les conversions forcées par une affectation ou par un opérateur de « cast ».
1.4 La notation octale ou hexadécimale des constantes
Pour écrire une constante entière, vous pouvez utiliser une notation octale (base 8) ou hexadécimale (base 16). La forme octale se note en faisant précéder le nombre écrit en base 8 du
chiffre 0.
Delannoy Livre.book Page 217 Mercredi, 6. mai 2009 4:26 16
Précédent

- 230/281

Suivant