© Éditions Eyrolles
219
chapitre n° 13
Les possibilités du langage C proches de la machine
a) Si le caractère n’est pas signé, on ajoute à gauche de son code 8 bits égaux à 0. Par exemple :
01001110 devient 0000000001001110
b) Si le caractère est signé, on ajoute à gauche de son code 8 bits égaux au premier bit du code
du caractère. Par exemple :
01001110 devient 0000000001001110
11011001 devient 1111111111011001
Cette démarche revient, en fait, à considérer que les 8 bits du code du caractère représentent
un (petit) entier codé lui aussi suivant la technique du complément à deux, avec bit de signe
à gauche. L’opération de conversion alors décrite correspond à ce que l’on nomme la
« propagation du bit de signe » ; elle permet d’obtenir un nombre entier sur 16 bits identique à
celui qui était représenté sur 8 bits. On peut dire que, vu comme cela, l’intégrité des données
est préservée, exactement comme elle l’était dans une conversion telle que int -> long
(qui, au demeurant, emploie exactement la même technique de propagation du bit de signe).
Ainsi, si n est de type int et que c est de type caractère, l’instruction :
n = c ;
conduira à affecter à n :
●
une valeur comprise entre -128 et 127 si c est de type unsigned char ;
●
une valeur comprise entre 0 et 255 si c est de type signed char.
La même remarque s’applique à la valeur affichée par :
printf ("%d", c) ;
2.2 Extension des règles de conversion
Notez qu’il n’y a aucune conversion d’un type caractère vers un autre type caractère, compte
tenu des conversions systématiques. En revanche, les conversions d’un entier vers un caractère
sont autorisées (dans les affectations ou avec l’opérateur de « cast »). Dans ce cas, elles sont
simplement mises en œuvre en ne conservant de l’entier que les bits les moins significatifs : le
motif binaire obtenu est le même, que le caractère en question soit signé ou non signé.
Théoriquement, de telles conversions apparaissent dans de banales affectations telles que :
c = c + 1 ;
/* ou c++ ; */
En pratique, et quel que soit l’attribut de signe de c, compte tenu de ce qui vient d’être dit, tout
se passe finalement comme si l’on avait ajouté 1 à 8 bits, sans tenir compte d’un éventuel
dépassement de capacité (et d’ailleurs, il n’est pas dit que certains compilateurs ne fassent pas
cela directement, sans passer par des conversions entier -> caractère -> entier).
Delannoy Livre.book Page 219 Mercredi, 6. mai 2009 4:26 16
Précédent

- 232/281

Suivant