Question

Après tout ce temps, je ne l'ai jamais pensé à poser cette question; Je comprends que cela est venu de c ++, mais ce qui était le raisonnement derrière:

  • Indiquez les nombres décimaux que vous normalement
  • Indiquez le nombre octal par un 0
  • Indiquez des nombres hexadécimaux par un 0x

Pourquoi 0? Pourquoi 0x? Y at-il une progression naturelle pour la base-32?

Était-ce utile?

La solution

C, l'ancêtre de C ++ et Java, a été développé à l'origine par Dennis Richie sur PDP-8s au début des années 70. Ces machines avaient un 12 bits adresse l'espace , de sorte que les pointeurs (adresses) étaient 12 bits long et plus commodément représenté dans le code de trois chiffres octaux de 4 bits (premier mot adressable serait 000octal, dernier mot adressable 777octal).

Octal ne sont pas bien adaptées à 8 octets de bits, car chaque chiffre octal représente trois bits, donc il y aura toujours en excès de bits représentable dans la notation octal. Un octet tout TRUE bits (1111 1111) est 377 en octal, mais FF en hexadécimal.

Hex est plus facile pour la plupart des gens de se convertir à et de binaires dans leurs têtes, car les nombres binaires sont généralement exprimés en blocs de huit (parce que c'est la taille d'un octet) et huit est exactement deux chiffres Hex, mais la notation Hex le ferait ont été maladroit et trompeur dans le temps de Dennis (ce qui implique la possibilité de traiter 16 bits). Les programmeurs doivent penser en binaire lorsque vous travaillez avec du matériel (pour lequel chaque bit représente généralement un fil physique) et lorsque l'on travaille avec la logique bit à bit (pour lequel chaque bit a une signification définie par le programmeur).

J'imagine Dennis a ajouté le préfixe 0 comme la plus simple variation possible sur les nombres décimaux tous les jours, et plus facile pour les premiers parseurs à distinguer.

Je crois que la notation Hex 0x__ a été ajouté à C un peu plus tard. L'arbre d'analyse de compilateur pour distinguer 1-9 (premier chiffre d'une constante décimale), 0 (première [insignifiante] chiffres d'une constante octal), et 0x (indiquant un hexagone constant à suivre chiffres suivants) de l'autre est beaucoup plus compliqué que d'utiliser simplement un 0 comme indicateur pour passer de l'analyse syntaxique des chiffres suivants comme octal plutôt que décimal.

Pourquoi concevoir Dennis cette façon? programmeurs contemporains n'apprécient pas que ces premiers ordinateurs étaient souvent contrôlés par des instructions au basculement CPU en basculant les commutateurs physiquement sur le panneau avant de la CPU, ou avec une carte perforée ou une bande de papier; tous les environnements où l'économie quelques étapes ou des instructions représentent des économies de main-d'œuvre importante. En outre, la mémoire est limitée et coûteuse, permettant ainsi d'économiser encore quelques instructions avaient une valeur élevée.

En résumé: 0 pour octal parce qu'il était efficace analysable et octal est convivial sur PDP-8s (au moins pour la manipulation d'adresse)

0x pour hex probablement parce qu'il était une extension naturelle et compatible en arrière sur la norme préfixe octal et encore relativement efficace pour analyser.

Autres conseils

Le préfixe zéro pour octal et 0x pour hex, sont des premiers jours d'Unix.

La raison pour les dates d'existence de octal quand il y avait du matériel avec des octets 6 bits, ce qui fait octal le choix naturel. Chaque chiffre octal représente 3 bits, de sorte qu'un octet de 6 bits est de deux chiffres octaux. La même chose vaut pour hexagone, à partir des octets de 8 bits, où un chiffre hexadécimal est de 4 bits, et donc un octet est de deux chiffres hexadécimaux. En utilisant octal pour les octets de 8 bits nécessite 3 chiffres octaux, dont le premier ne peut avoir les valeurs 0, 1, 2 et 3 (le premier chiffre est vraiment « TETRAL », non octal). Il n'y a aucune raison d'aller à base32 à moins que quelqu'un développe un système dans lequel les octets sont dix bits de long, donc un octet de dix bits peut être représenté comme deux 5 bits « quartets ».

Les « nouveaux » chiffres devaient commencer par un chiffre, pour travailler avec la syntaxe existante.

La pratique établie avait des noms de variables et d'autres identifiants commençant par une lettre (ou quelques autres symboles, peut-être souligner ou signe dollar). Ainsi, « un », « abc » et « A04 » sont tous les noms. Les chiffres ont commencé par un chiffre. Donc, « 3 » et « 3e5 » sont des nombres.

Lorsque vous ajoutez des choses nouvelles à un langage de programmation, vous cherchez à les faire entrer dans la syntaxe existantes, la grammaire et la sémantique, et vous essayez de faire le code existant continuer à travailler. Donc, vous ne voudriez pas changer la syntaxe pour faire « x34 » un nombre hexadécimal ou « O34 » un nombre octal.

Alors, comment vous situez-vous dans les chiffres octal cette syntaxe? Quelqu'un a réalisé que, à l'exception de « 0 », il n'y a pas besoin de chiffres commençant par « 0 ». Personne n'a besoin d'écrire « 0123 » pour 123. Nous utilisons donc un zéro pour indiquer des chiffres octal.

Qu'en est-il des chiffres hexadécimaux? Vous pouvez utiliser un suffixe, de sorte que « 34x » signifie 34 16 . Cependant, l'analyseur doit lire tout le chemin jusqu'à la fin du chiffre avant qu'elle ne sait comment interpréter les chiffres (à moins qu'il ne rencontre l'un des « a » à chiffres « f », qui bien entendu indiquer hexadécimal). Il est « plus facile » sur l'analyseur de savoir que le chiffre est hexadécimal tôt. Mais vous devez toujours commencer par un chiffre, et le tour zéro a déjà été utilisé, donc nous avons besoin d'autre chose. « X » a été choisi, et nous avons maintenant « 0x » pour hexadécimal.

(ci-dessus est basée sur ma compréhension de l'analyse syntaxique et un peu d'histoire générale sur le développement du langage, et non pas sur la connaissance des décisions spécifiques prises par les développeurs du compilateur ou des comités linguistiques.)

Je ne sais pas ...

0 est pour 0ctal

0x est pour, bien, nous avons déjà utilisé 0 signifie octal et il y a un x en hexadécimal si bung que là aussi

comme pour la progression naturelle, meilleur look les derniers langages de programmation qui peuvent apposent tels que les indices

123_27 (interprétation _ signifie indice)

et ainsi de suite

Mark

  

Y at-il une progression naturelle pour la base-32?

Cela fait partie des raisons pour lesquelles Ada utilise le formulaire 16 # pour introduire des constantes hexagonaux, 8 # pour octal, 2 # pour le binaire, etc.

Je ne me préoccuper trop de l'espace pour plus besoin « croissance future » en fondant bien. Ce n'est pas comme RAM ou espace d'adressage où vous avez besoin d'un ordre de grandeur plus toutes les générations.

En fait, des études ont montré que octal et hexadécimal sont à peu près la sweet spot pour les représentations lisibles par l'homme qui sont compatibles en mode binaire. Si vous allez plus bas que octal, il commence à exiger un certain nombre de chiffres rediculous pour représenter un plus grand nombre. Si vous allez plus haut que hexadécimal, les tables mathématiques se rediculously grand. Hex est en fait un peu trop déjà, mais Octal a le problème qu'il ne correspond pas uniformément dans un octet.

Il y a un codage standard pour Base32 . Il est très similaire à base64 . Mais il est pas très pratique à lire. Hex est utilisé parce que 2 chiffres hexadécimaux peuvent être utilisés pour représenter 1 octet de 8 bits. Et octal a été utilisé principalement pour les systèmes plus anciens qui ont utilisé 12 bits octets. Il a fait une représentation plus compacte des données par rapport à l'affichage des registres bruts sous forme binaire.

Il convient également de noter que certaines langues utilisent o ### pour octal et x ## ou ## h pour hex, ainsi que, de nombreuses autres variantes.

Je pense que ce 0x est réellement venu pour le monde UNIX / Linux et a été choisi par-up C / C ++ et d'autres langues. Mais je ne connais pas la raison exacte ou véritable origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top