Frage

Nach all dieser Zeit habe ich nie gedacht, diese Frage zu stellen. Ich verstehe, dass dies von C ++ kam, aber was war die Gründe dafür:

  • Geben Sie Dezimalzahlen an, wie Sie es normalerweise tun würden
  • Geben Sie Oktalzahlen nach einer führenden 0 an
  • Geben Sie Hexadezimalzahlen durch eine führende 0x an

Warum 0? Warum 0x? Gibt es einen natürlichen Fortschritt für Base-32?

War es hilfreich?

Lösung

C, der Vorfahr von C ++ und Java, wurde ursprünglich Anfang der 70er Jahre von Dennis Richie auf PDP-8 entwickelt. Diese Maschinen hatten eine 12-Bit-Adressraum, Die Zeiger (Adressen) waren also 12 Bits lang und am bequemsten in Code von drei 4-Bit-Oktalstellen (erstes adressierbares Wort wäre 000octal, das letzte adressierbare Wort 777octal).

Octal kartiert nicht gut auf 8 -Bit -Bytes, da jede Oktal -Ziffer drei Bits darstellt, sodass in der Oktalnotation immer überschüssige Bits dargestellt werden können. Ein All-True-Bit-Byte (1111 1111) beträgt 377 im Oktal, aber FF in Hex.

Hex ist für die meisten Menschen leichter, in den Köpfen zu und von Binärer zu konvertieren, da die Binärzahlen normalerweise in Blöcken von acht (weil das die Größe eines Byte ist) und acht genau zwei Sechskantigstellen, aber die Hex -Notation wäre klobig gewesen gewesen und irreführend in Dennis 'Zeit (implizieren die Fähigkeit, 16 Bits anzugehen). Programmierer müssen in Binär arbeiten, wenn sie mit Hardware arbeiten (für das jedes Bit typischerweise einen physischen Kabel darstellt) und bei der Arbeit mit bitwise Logik (für das jedes Bit einen Programmierer definiert hat).

Ich stelle mir vor, Dennis fügte das 0 Präfix als einfachste Variation der alltäglichen Dezimalzahlen hinzu und für diese frühen Parser am einfachsten zu unterscheiden.

Ich glaube, die Hex -Notation 0x__ wurde etwas später zu C hinzugefügt. Der Compiler-Parse Tree zur Unterscheidung von 1-9 (erste Ziffer einer Dezimalkonstante), 0 (erste [unbedeutende] Ziffer einer Oktalkonstante) und 0x (was eine Hex-Konstante anzeigt, die in nachfolgenden Ziffern folgt) voneinander erheblich stärker ist kompliziert als nur eine führende 0 als Indikator zum Wechsel vom Parsen nachfolgenden Ziffern als Oktal und nicht als Dezimalziffern.

Warum hat Dennis so gestaltet? Zeitgenössische Programmierer Schätzen Sie nicht, dass diese frühen Computer häufig durch Umschaltanweisungen in die CPU gesteuert wurden, indem Schalter auf der CPUs Frontplatte oder mit einer Lochkarte oder einem Papierband physisch umdrehen. Alle Umgebungen, in denen ein paar Schritte oder Anweisungen einsparen, stellten Einsparungen von erheblichen manuellen Arbeitskräften dar. Außerdem war das Gedächtnis begrenzt und teuer, so dass das Speichern einiger Anweisungen einen hohen Wert hatte.

Zusammenfassend: 0 für Oktal, weil es effizient ansparbar war und Oktal auf PDP-8s benutzerfreundlich war (zumindest für die Adressmanipulation)

0x für Hex wahrscheinlich, weil es eine natürliche und rückwärtskompatible Erweiterung des Oktalpräfixstandards war und immer noch relativ effizient zu analysieren ist.

Andere Tipps

Das Null -Präfix für Oktal und 0x für Hex stammt aus den frühen Tagen von Unix.

Der Grund für die Existenz von Octal stammt aus, als es Hardware mit 6-Bit-Bytes gab, was Octal zur natürlichen Wahl machte. Jede Oktalfigur repräsentiert 3 Bit, so dass ein 6-Bit-Byte zwei Oktalfiguren beträgt. Gleiches gilt für Hex, von 8-Bit-Bytes, wo eine Sechskantendiffer 4 Bit beträgt und somit ein Byte zwei Sechskantigstellen beträgt. Die Verwendung von Oktal für 8-Bit-Bytes erfordert 3 Oktalstellen, von denen der erste nur die Werte 0, 1, 2 und 3 haben kann (die erste Ziffer ist wirklich 'tetral', nicht Oktal). Es gibt keinen Grund, zu Base32 zu gehen, es sei denn, jemand entwickelt ein System, in dem Bytes zehn Teile lang sind, sodass ein zehn-Bit-Byte als zwei 5-Bit-Nybbles dargestellt werden kann.

"Neue" Ziffern mussten mit einer Ziffer beginnen, um mit vorhandener Syntax zu arbeiten.

Die festgelegte Praxis hatte variable Namen und andere Kennungen, die mit einem Buchstaben (oder ein paar anderen Symbolen, möglicherweise unterstrichen) oder ein Dollar -Schild). Also sind "A", "ABC" und "A04" alle Namen. Die Zahlen begannen mit einer Ziffer. "3" und "3e5" sind also Zahlen.

Wenn Sie einer Programmiersprache neue Dinge hinzufügen, versuchen Sie, sie in die vorhandene Syntax, Grammatik und Semantik zu passen, und versuchen, vorhandenen Code weiter zu arbeiten. Sie möchten also die Syntax nicht ändern, um "x34" eine Hexadezimalzahl oder "O34" zu einer Oktalzahl zu machen.

Wie passen Sie also Octal -Ziffern in diese Syntax? Jemand erkannte, dass mit „0“ Ziffern mit „0“ nicht erforderlich ist. Niemand muss für 123 "0123" schreiben. Wir verwenden also ein führendes Null, um Oktalzahlen zu bezeichnen.

Was ist mit hexadezimalen Ziffern? Sie könnten ein Suffix verwenden, damit „34x“ 34 bedeutet16. Dann muss der Parser bis zum Ende der Ziffer lesen, bevor er weiß, wie man die Ziffern interpretiert (es sei denn, er stößt auf einen der "A" zu "F" -Ziffern, was natürlich hexadezimal anzeigen würde). Auf dem Parser ist es „einfacher“ zu wissen, dass die Zahl früh hexadezimal ist. Aber Sie müssen immer noch mit einer Ziffer beginnen, und der Null -Trick wurde bereits verwendet, also brauchen wir etwas anderes. "X" wurde ausgewählt, und jetzt haben wir "0x" für Hexadezimal.

(Die oben genannten basiert auf meinem Verständnis der Parsen und einer allgemeinen Geschichte über die Sprachentwicklung, nicht auf dem Wissen über spezifische Entscheidungen von Compiler -Entwicklern oder Sprachkomitees.)

Ich weiß nicht ...

0 ist für 0CTAL

0x ist für, nun, wir haben bereits 0 verwendet, um Oktal zu bedeuten, und es gibt ein X in Hexadezimal, so dass es auch da drin ist

In Bezug

123_27 (interpretieren Sie _, um ein Einweis zu bedeuten)

usw

?

Markieren

Gibt es einen natürlichen Fortschritt für Base-32?

Dies ist ein Teil dessen, warum ADA das Formular 16# verwendet, um HEX -Konstanten einzuführen, 8# für Oktal, 2# für Binary usw.

Ich würde mich jedoch nicht allzu sehr über das "zukünftige Wachstum" im Basis von "zukünftiges Wachstum" befassen. Dies ist nicht wie RAM oder adressierte Raum, in dem Sie jede Generation mehr Größenordnung benötigen.

Tatsächlich haben Studien gezeigt, dass Oktal und Hex so ziemlich die sind Sweet Spot für menschlich lesbare Darstellungen, die binäre kompatibel sind. Wenn Sie tiefer als Oktal gehen, erfordert es eine lächerliche Anzahl von Ziffern, um größere Zahlen darzustellen. Wenn Sie höher als Hex gehen, werden die Mathematischen Tische rötlich groß. Hex ist schon ein bisschen zu viel, aber Octal hat das Problem, dass es nicht gleichmäßig in ein Byte passt.

Es gibt eine Standardcodierung für Basis32. Es ist sehr ähnlich zu Basis64. Aber es ist nicht sehr bequem zu lesen. Hex wird verwendet, weil 2 Hex-Ziffern verwendet werden können, um 1 8-Bit-Byte darzustellen. Und Oktal wurde hauptsächlich für ältere Systeme verwendet, die verwendeten 12-Bit Bytes. Es führte zu einer kompakteren Darstellung von Daten im Vergleich zum Anzeigen von Rohregistern als binär.

Es sollte auch beachtet werden, dass einige Sprachen O ### für Oktal und X ## oder H ## für Hex sowie viele andere Variationen verwenden.

Ich denke es 0x Eigentlich kam für die Unix/Linux-Welt und wurde von C/C ++ und anderen Sprachen aufgenommen. Aber ich kenne den genauen Grund oder den wahren Ursprung nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top