Tout vient du matériel.
Un octet est la plus petite unité de mémoire adressable sur la plupart du matériel.
Chaque type que vous venez de mentionner est construit à partir de plusieurs multiples d'octets.
Un octet fait 8 bits. Avec cela, vous pouvez exprimer 8 booléens mais vous ne pouvez pas rechercher un seul à la fois. Vous vous adressez à 1, vous vous adressez aux 8.
Auparavant, c'était aussi simple que cela, mais nous sommes passés d'un bus 8 bits à un bus 16, 32 et maintenant 64 bits.
Ce qui signifie que même si nous pouvons encore adresser au niveau des octets, nous ne pouvons plus récupérer un seul octet de la mémoire sans obtenir ses octets voisins.
Face à ce matériel, les concepteurs de langage ont choisi de nous permettre de choisir des types qui nous permettaient de choisir des types adaptés au matériel.
Vous pouvez prétendre qu'un tel détail peut et doit être résumé, en particulier dans un langage qui vise à s'exécuter sur n'importe quel matériel. Cela aurait des problèmes de performances cachés, mais vous avez peut-être raison. Cela ne s'est tout simplement pas produit de cette façon.
Java essaie en fait de le faire. Les octets sont automatiquement promus en Ints. Un fait qui vous rendra fou la première fois que vous essayez de faire un travail de changement de bit sérieux.
Alors pourquoi ça n'a pas bien fonctionné?
Le grand argument de vente de Java remonte à l'époque où vous pouviez vous asseoir avec un bon algorithme C connu, le taper en Java, et avec des ajustements mineurs, cela fonctionnerait. Et C est très proche du matériel.
Garder cette taille active et abstraite des types intégraux ne fonctionnait tout simplement pas ensemble.
Alors ils auraient pu. Ils ne l'ont tout simplement pas fait.
Peut-être que le programmeur ne voudrait pas que quelqu'un puisse utiliser un nombre supérieur à une certaine taille et cela lui permet de le limiter.
C'est une pensée valable. Il existe des méthodes pour ce faire. La fonction de serrage pour un. Un langage pourrait aller jusqu'à créer des limites arbitraires dans leurs types. Et lorsque ces limites sont connues au moment de la compilation, cela permettrait d'optimiser la façon dont ces nombres sont stockés.
Java n'est tout simplement pas ce langage.