Les entiers constituent la structure de données la plus fondamentale en informatique, si nous pouvons même les appeler une « structure ». Notre travail en tant que programmeurs est de donner un sens à ces chiffres. Quelle que soit la complexité du logiciel : au final, ce n'est qu'un entier, et votre processeur ne comprend que les entiers.
Si nous avons besoin de nombres négatifs, nous avons inventé le complément à deux. Si nous avons besoin de nombres fractionnaires, nous créons une sorte de notation scientifique et – boum – nous avons un flotteur. En fin de compte, on ne peut échapper aux zéros et aux uns.
En C, l'int est presque du type naturel. Bien que les compilateurs puissent se plaindre, avec quelques indicateurs ici et là, la plupart vous permettront d'écrire quelque chose comme ceci :
main(void) { return 0; }
Techniquement, cela équivaut à :
int main(void) { return 0; }
Ce comportement vient d'une époque où il était de bon sens de supposer que, si le programmeur ne spécifiait pas de type, il était raisonnable d'utiliser par défaut un nombre entier.
C a été conçu avec cette idée en tête. Au départ, int n’avait pas de taille standard. Le processeur PDP-11 — la machine pour laquelle C a été créé à l'origine — utilisait un adressage 16 bits. On a donc supposé qu'il était logique qu'un int soit également de 16 bits. L'idée était que la taille de int augmenterait à mesure que les processeurs évolueraient.
Cette approche a créé quelques problèmes. Si la taille de int varie selon les plates-formes, les programmes compilés pour différents processeurs pourraient se comporter différemment. Cela a brisé l'idée selon laquelle C était un langage « agnostique » qui compile sur diverses architectures.
Contrairement à int, le char, par exemple, avait toujours une taille bien définie : 8 bits, signé. Malgré son nom, char n'est pas un type abstrait pour les caractères de texte ; c'est juste un nombre de 8 bits. Par exemple, le littéral « a » est converti au moment de la compilation en nombre 97, clair et simple.
Et qu'en est-il des autres types, comme les courts et les longs ? L'idée était simple :
short <= int <= long
Les implémenteurs du compilateur avaient toute liberté pour décider des tailles spécifiques.
Avec la norme ANSI C, quelques règles ont été établies :
Cette organisation a aidé, mais la taille de int est restée pour le moins déroutante. Les choses se sont améliorées avec la norme C99, qui a introduit l'en-tête stdint.h.
Nous avons maintenant des types de taille fixe :
Dès lors, c'était au compilateur d'implémenter cet en-tête avec des types de taille fixe.
Aujourd'hui, avec des compilateurs modernes comme GCC et Clang, les tailles sont plus prévisibles :
Type | Size |
---|---|
char | 8 bits |
short | 16 bits |
int | 32 bits |
long | 64 bits (32 bits on 32-bit systems) |
long long | 64 bits |
Même si le long long est quand même un peu particulier, au moins il apporte une certaine cohérence (je trouve même le long long stylé, pour être honnête).
Aujourd'hui, nous sommes bien équipés avec des en-têtes comme stddef.h et stdint.h. Utilisez int uniquement lorsque cela est nécessaire, comme pour le type de retour de la fonction principale. Pour tout ce qui va au-delà du prototypage, préférez utiliser des entiers de taille fixe de stdint.h, et pour les indices de tableau ou les boucles, utilisez size_t de stddef.h. J'espère que cela vous évitera quelques maux de tête plus tard.
Merci d'être arrivé jusqu'ici — à la prochaine fois !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!