Le C est un langage typé. Cela signifie en particulier que toute variable, constante ou fonction est d'un type précis. Le type d'un objet définit la façon dont il est représenté en mémoire.
La mémoire de l'ordinateur se décompose en une suite continue d'octets. Chaque octet de la mémoire est caractérisé par son adresse, qui est un entier. Deux octets contigus en mémoire ont des adresses qui diffèrent d'une unité. Quand une variable est définie, il lui est attribué une adresse. Cette variable correspondra à une zone mémoire dont la longueur (le nombre d'octets) est fixée par le type.
La taille mémoire correspondant aux différents types dépend des compilateurs ; toutefois, la norme ANSI spécifie un certain nombre de contraintes.
Les types de base en C concernent les caractères, les entiers et les flottants (nombres réels). Ils sont désignés par les mots-clefs suivants :
| char | ||
| int | ||
| float | double | |
| short | long | unsigned |
1. Le type caractère
Le mot-clef char désigne un objet de type caractère. Un char peut contenir n'importe quel élément du jeu de caractères de la machine utilisée. La plupart du temps, un objet de type char est codé sur un octet ; c'est l'objet le plus élémentaire en C. Le jeu de caractères utilisé correspond généralement au codage ASCII (sur 7 bits). La plupart des machines utilisent désormais le jeu de caractères ISO-8859 (sur 8 bits), dont les 128 premiers caractères correspondent aux caractères ASCII. Les 128 derniers caractères (codés sur 8 bits) sont utilisés pour les caractères propres aux différentes langues. La version ISO-8859-1 (aussi appelée ISO-LATIN-1) est utilisée pour les langues d'Europe occidentale. Ainsi, le caractère de code 232 est le è, le caractère 233 correspond au é...Pour plus de détails sur l'historique du codage des caractères pour les différentes langues ainsi que sur la norme UNICODE (sur 16 bits, qui permet de coder les caractères pour toutes les langues) et sur la norme ISO/IEC-10646 (sur 32 bits, ce qui permet d'ajouter les caractères anciens), consulter l'article de J. André et M. Goossens.
déc. oct. hex. déc. oct. hex. déc. oct. hex. 32 40 20 @ 64 100 40 ` 96 140 60 ! 33 41 21 A 65 101 41 a 97 141 61 " 34 42 22 B 66 102 42 b 98 142 62 #35 43 23 C 67 103 43 c 99 143 63 $36 44 24 D 68 104 44 d 100 144 64 %37 45 25 E 69 105 45 e 101 145 65 &38 46 26 F 70 106 46 f 102 146 66 ' 39 47 27 G 71 107 47 g 103 147 67 ( 40 50 28 H 72 110 48 h 104 150 68 ) 41 51 29 I 73 111 49 i 105 151 69 * 42 52 2a J 74 112 4a j 106 152 6a + 43 53 2b K 75 113 4b k 107 153 6b , 44 54 2c L 76 114 4c l 108 154 6c - 45 55 2d M 77 115 4d m 109 155 6d . 46 56 2e N 78 116 4e n 110 156 6e / 47 57 2f O 79 117 4f o 111 157 6f 0 48 60 30 P 80 120 50 p 112 160 70 1 49 61 31 Q 81 121 51 q 113 161 71 2 50 62 32 R 82 122 52 r 114 162 72 3 51 63 33 S 83 123 53 s 115 163 73 4 52 64 34 T 84 124 54 t 116 164 74 5 53 65 35 U 85 125 55 u 117 165 75 6 54 66 36 V 86 126 56 v 118 166 76 7 55 67 37 W 87 127 57 w 119 167 77 8 56 70 38 X 88 130 58 x 120 170 78 9 57 71 39 Y 89 131 59 y 121 171 79 : 58 72 3a Z 90 132 5a z 122 172 7a ; 59 73 3b [ 91 133 5b {123 173 7b <60 74 3c \92 134 5c |124 174 7c = 61 75 3d ] 93 135 5d }125 175 7d >62 76 3e ^94 136 5e ~126 176 7e ? 63 77 3f _95 137 5f DEL127 177 7f Codes ASCII des caractères imprimables
Une des particularités du type char en C est qu'il peut être assimilé à un entier : tout objet de type char peut être utilisé dans une expression qui utilise des objets de type entier. Par exemple, si c est de type char, l'expression c + 1 est valide. Elle désigne le caractère suivant dans le code ASCII. La table précédente donne le code ASCII (en décimal, en octal et en hexadécimal) des caractères imprimables. Ainsi, le programme suivant imprime le caractère 'B'.
main()
{
char c = 'A';
printf("%c", c + 1);
}
Suivant les implémentations, le type char est signé ou non. En cas de doute, il vaut mieux préciser unsigned char ou signed char. Notons que tous les caractères imprimables sont positifs.
2. Les types entiers
Le mot-clef désignant le type entier est int. Un objet de type int est représenté par un mot ``naturel'' de la machine utilisée, 32 bits pour un DEC alpha ou un PC Intel.
Le type int peut être précédé d'un attribut de précision (short ou long) et/ou d'un attribut de représentation (unsigned).Un objet de type short int a au moins la taille d'un char et au plus la taille d'un int. En général, un short int est codé sur 16 bits. Un objet de type long int a au moins la taille d'un int (64 bits sur un DEC alpha, 32 bits sur un PC Intel).
DEC Alpha PC Intel (Linux) char 8 bits 8 bits caractère short 16 bits 16 bits entier court int 32 bits 32 bits entier long 64 bits 32 bits entier long long long n.i. 64 bits entier long (non ANSI) Les types entiers
Le bit de poids fort d'un entier est son signe. Un entier positif est donc représenté en mémoire par la suite de 32 bits dont le bit de poids fort vaut 0 et les 31 autres bits correspondent à la décomposition de l'entier en base 2. Par exemple, pour des objets de type char (8 bits), l'entier positif 12 sera représenté en mémoire par 00001100. Un entier négatif est, lui, représenté par une suite de 32 bits dont le bit de poids fort vaut 1 et les 31 autres bits correspondent à la valeur absolue de l'entier représentée suivant la technique dite du ``complément à 2''. Cela signifie que l'on exprime la valeur absolue de l'entier sous forme binaire, que l'on prend le complémentaire bit-à-bit de cette valeur et que l'on ajoute 1 au résultat. Ainsi, pour des objets de type signed char (8 bits), -1 sera représenté par 11111111, -2 par 11111110, -12 par par 11110100.Un int peut donc représenter un entier entre -231 et (231-1). L'attribut unsigned spécifie que l'entier n'a pas de signe. Un unsigned int peut donc représenter un entier entre 0 et (232-1). Sur un DEC alpha, on utilisera donc un des types suivants en fonction de la taille des données à stocker :
| signed char | [-27;27[ |
| unsigned char | [0;28[ |
| short int | [-215; 215[ |
| unsigned short int | [0;216[ |
| int | [-231;231[ |
| unsigned int | [0;232[ |
| long int (DEC alpha) | [-263;263[ |
| unsigned long int (DEC alpha) | [0;264[ |
Plus généralement, les valeurs maximales et minimales des différents types entiers sont définies dans la librairie standard limits.h.
Le mot-clef sizeof a pour syntaxe
sizeof(expression)
où expression est un type ou un objet. Le résultat est un entier égal au nombre d'octets nécessaires pour stocker le type ou l'objet. Par exemple
unsigned short x; taille = sizeof(unsigned short); taille = sizeof(x);
Dans les deux cas, taille vaudra 4.
Pour obtenir des programmes portables, on s'efforcera de ne jamais présumer de la taille d'un objet de type entier. On utilisera toujours une des constantes de limits.h ou le résultat obtenu en appliquant l'opérateur sizeof.
3. Les types flottants
Les types float, double et long double servent à représenter des nombres en virgule flottante. Ils correspondent aux différentes précisions possibles.
DEC Alpha PC Intel float 32 bits 32 bits flottant double 64 bits 64 bits flottant double précision long double 64 bits 128 bits flottant quadruple précision
Les flottants sont généralement stockés en mémoire sous la représentation de la virgule flottante normalisée. On écrit le nombre sous la forme ``signe 0, mantisse Bexposant''. En général, B=2. Le digit de poids fort de la mantisse n'est jamais nul.
Un flottant est donc représenté par une suite de bits dont le bit de poids fort correspond au signe du nombre. Le champ du milieu correspond à la représentation binaire de l'exposant alors que les bits de poids faible servent à représenter la mantisse.
2017-10-12 02:51:43 / mazoughou@magoe.gn
0 commentaires
Votre impression compte aussi