Pourquoi un octet char
1
est-il long en C? Pourquoi est-ce que ce n'est pas 2
bytes ou 4
bytes long?
Quelle est la logique de base derrière le maintien du 1
octet? Je sais qu'en Java une char
a 2
octets de long. Même question pour ça.
char
est 1 octet dans C
car il est spécifié ainsi dans les normes.
La logique la plus probable est. la représentation (binaire) d'une char
(dans le jeu de caractères standard) peut être insérée dans 1
octet. Au moment du développement principal de C
, les normes les plus couramment disponibles étaient ASCII
et EBCDIC
qui nécessitaient un codage 7 et 8 bits, respectivement. Donc, 1
octet était suffisant pour représenter l’ensemble du jeu de caractères.
OTOH, au moment où Java
est entré en scène, les concepts de jeu de caractères étendus et unicode
étaient présents. Donc, pour être à l’avenir et supporter l’extensibilité, char
a reçu 2 bytes
, qui est capable de gérer les valeurs de extended jeux de caractères.
Pourquoi une char
en détiendrait-elle plus d'un octet? Un caractère représente normalement un caractère ASCII. Il suffit de jeter un coup d’œil à une table ASCII, le code (étendu) ASCII ne contient que 256 caractères. Il suffit donc de représenter des nombres de 0 à 255, ce qui revient à 8 bits = 1 octet.
Examinez une table ASCII, par exemple. ici: http://www.asciitable.com/
C’est pour C. Lors de la conception de Java, ils prévoyaient qu’à l’avenir, il suffirait que tous les caractères (également Unicode) soient conservés sur 16 bits = 2 octets.
C'est parce que la langue C a 37 ans et qu'il n'était pas nécessaire d'avoir plus d'octets pour 1 caractère, car seuls 128 caractèresASCII ont été utilisés ( http://en.wikipedia.org/wiki/ASCII ).
Lorsque C a été développé (le premier livre a été publié par ses développeurs en 1972), les deux normes principales de codage des caractères étaient ASCII et EBCDIC, qui étaient respectivement des codages 7 et 8 bits pour les caractères. Et la mémoire et l’espace disque étaient tous deux plus préoccupants à l’époque; C a été popularisé sur des machines disposant d'un espace d'adressage de 16 bits et l'utilisation de plus d'un octet pour les chaînes aurait été considérée comme une perte de temps.
Au moment où Java est apparu (milieu des années 90), certains ayant une vision claire étaient capables de percevoir qu’une langue pouvait utiliser une norme internationale pour l’encodage de caractères. Unicode a donc été choisi pour sa définition. La mémoire et l’espace disque étaient désormais moins problématiques.
La norme de langage C définit une machine virtuelle dans laquelle tous les objets occupent un nombre entier abstrait unités de stockage constitué d’un nombre fixe de bits (spécifié par la macro CHAR_BIT
dans limits.h). Chaque unité de stockage doit être uniquement adressable. Une unité de stockage est définie comme la quantité de stockage occupée par un seul caractère du jeu de caractères de base.1. Ainsi, par définition , la taille du type char
est 1.
Éventuellement, ces unités de stockage abstraites doivent être mappées sur du matériel physique. La plupart des architectures courantes utilisent des octets 8 bits adressables individuellement. Par conséquent, les objets char
sont généralement mappés sur un seul octet 8 bits.
Habituellement.
Historiquement, les tailles d’octets natifs ont été comprises entre 6 et 9 bits. En C, le type char
doit avoir une largeur de au moins 8 bits pour pouvoir représenter tous les caractères du jeu de caractères de base. Pour prendre en charge une machine avec des octets de 6 bits, un compilateur peut donc devoir mapper un objet char
. sur deux octets d'ordinateur natifs, avec CHAR_BIT
égal à 12. sizeof (char)
étant toujours égal à 1, les types de taille N
mapperont sur 2 * N
octets natifs.
Vous n'avez pas besoin de plus d'un octet pour représenter la table entière ASCII (128 caractères).
Mais il existe d’autres types C qui ont plus d’espace pour contenir des données, comme int type (4 octets) ou long double type (12 octets).
Tous ces éléments contiennent des valeurs numériques (même des caractères! Même s'ils sont représentés par des "lettres", ce sont des "chiffres", vous pouvez les comparer, les ajouter ...).
Ce ne sont que différentes tailles standard, telles que cm et m pour la longueur,.