web-dev-qa-db-fra.com

Pourquoi le caractère est de 1 octet en langage C

Pourquoi un octet char1 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.

8
daniyalahmad

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.

22
Sourav Ghosh

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.

5
Nidhoegger

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 ).

5
Pavel Gatnar

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.

2
arcy

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.


1. Le jeu de caractères de base comprend les 26 lettres anglaises en majuscules et minuscules, 10 chiffres, des signes de ponctuation et autres caractères graphiques, ainsi que des caractères de contrôle tels que des nouvelles lignes, des tabulations, des sauts de formulaire, etc., qui s'intègrent aisément à 8 morceaux.
2
John Bode

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,.

0
vmonteco