Si l'on change en <unsigned char c = getchar(); > la déclaration de la variable c, on obtient le résultat suivant :
Code:
1 2 3
| $ caracteres
caractères accentués
CARACTèRES ACCENTUéS |
La raison de ce dysfonctionnement apparent est simple. Prenons le cas du caractère 'é', codé dans la norme ISO par la suite de bits 11101001. Sur un octet, cette valeur code la valeur décimale 233 dans le cas d'une arithmétique sans signe, et -23 dans le cas d'une arithmétique signée. Une constante caractère étant de type int, elle est signée. La valeur de la constante 'é' est -23. Par contre la variable c étant de type unsigned char, sa valeur est 233.
La première version du programme n'est par conséquent pas portable car elle dépend de l'implémentation du type char. Pour y remédier, il faut déclarer la variable c de type signed char. Nous verrons d'autre part, dans le chapitre 6, qu'il existe un mécanisme portable appelé contrôle local, permettant de prendre en compte les spécificités des différentes langues.