30 votes

Pourquoi POSIX a-t-il mandaté CHAR_BIT == 8?

Il y a une note dans la POSIX justification que le fait d'obliger CHAR_BIT être 8 est une concession que l'on fait ce qui était nécessaire pour maintenir l'alignement avec le C99, sans jeter les prises de sortie/mise en réseau, mais je n'ai jamais vu l'explication de ce qu'est exactement le conflit a été. Quelqu'un aurait-il des anecdotes ou citations pour pourquoi il a été jugé nécessaire?

Edit: j'ai eu beaucoup de spéculation réponses sur le pourquoi il est souhaitable CHAR_BIT à 8, et je suis d'accord, mais ce que je suis à la recherche de ce que la technique de conflit entre le C99 et la mise en réseau des trucs dans POSIX est. Ma meilleure supposition est qu'il a quelque chose à voir avec le C99 nécessitant uint*_t pour être exact-types de taille (sans rembourrage) alors que l' inttypes.h précédemment dans POSIX fait pas une telle exigence.

11voto

paxdiablo Points 341644

Parce que la grande majorité des normes (en matière de communication) de l'ANSI et ISO parler en termes d'octets (8 bits des valeurs). Il n'y a rien de fade de taille variable caractère non-sens :-)

Et, depuis une assez grande quantité de code C utilisé char ou unsigned char pour le stockage et/ou de la manipulation de ces valeurs, et supposé qu'ils étaient 8 bits de large, le fait que l'ISO a permis de taille variable pourrait entraîner des problèmes pour le code.

Souvenez-vous de la plus-équitation objectifs de la norme ISO C - code existant est important, implémentations existantes ne sont pas. C'est une des raisons pourquoi limits.h il existe, en premier lieu, plutôt que de simplement en supposant des valeurs spécifiques, parce qu'il y avait de code autour de l'hypothèse contraire.

POSIX également suivi la même ligne directrice. En imposant une taille en octets de 8 bits, ils ont empêché la rupture d'une énorme quantité de code déjà dans le monde réel.

8voto

Billy ONeal Points 50631

Parce qu' char est la plus petite unité adressable en C, si vous avez fait char de plus de 8 bits, il serait difficile, voire impossible, d'écrire une implémentation, comme vous l'avez dit. Les réseaux fonctionnent toutes sur CHAR_BIT == 8 des machines. Donc, si vous envoyez un message à partir d'une machine où l' CHAR_BIT == 9 à une machine où l' CHAR_BIT == 8, qu'est-ce que la bibliothèque des sockets à voir avec le bit supplémentaire? Il n'y a pas de réponse raisonnable à cette question. Si vous tronquez le peu, puis il devient difficile de spécifier même quelque chose d'aussi simple comme un tampon pour le client de les sockets code: "C'est un tableau de char, mais vous ne pouvez utiliser que les 8 premiers bits" serait déraisonnable sur un tel système. En outre, passant de 8 bits des systèmes à 9 bits serait le même problème -- quels sont les sockets système de le faire avec un peu plus? Si elle établit que les bits à zéro, imaginez ce qui arrive à quelqu'un qui met un int sur le fil. Que vous avez à faire toutes sortes de mauvaises bitmasking sur les 9 bits de la machine pour le faire fonctionner correctement.

Enfin, étant donné que 99,9% des machines 8 bits de caractères, il n'est pas tout que d'une limitation. La plupart des machines qui utilisent CHAR_BIT != 8 n'ont pas de mémoire virtuelle, ce qui permettrait d'exclure de la compatibilité POSIX de toute façon.

Lorsque vous êtes en cours d'exécution sur un seul ordinateur (standard C suppose), vous pouvez faire des choses comme être CHAR_BIT agnostique, parce que les deux côtés de ce qui pourrait être la lecture ou l'écriture des données d'accord sur ce qu'il se passe. Lorsque vous introduisez quelque chose comme sockets, où plus d'une machine sont concernés, ils DOIVENT s'entendre sur des choses comme la taille des caractères et l'endianness. (Endinanness est à peu près juste normalisé pour Big Endian sur le fil, si, comme beaucoup d'autres architectures diffèrent sur l'endianness qu'ils font sur la taille en octets)

1voto

Mehrdad Points 70493

Mes suppositions:

  • Beaucoup de code passe par bits comme

    for (int i = 0; i < 8; i++) { ... }
    

    et tout ce qui allait se briser.

  • La plupart des autres langues supposons qu'elle est de 8 bits, de toute façon, et ils seraient complètement casser si c'est le contraire

  • Même si la plupart des langues n'a pas besoin de cela, la plupart ABIs serait toujours en pause

  • C'est pratique en hexadécimal (deux unités): 0xAA

  • Si vous commencez à aller dans cette voie, alors vous pourriez commencer à penser: eh Bien, qui dit que nous devons utiliser 2-état des bits? Pourquoi ne pas avoir tristate bits? etc... ça commence à devenir de moins en moins pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X