Wo sind Oktale nützlich? [geschlossen]

36

Ich habe nur meinen Kopf für ungefähr 20 Minuten gegen den Tisch geschlagen und einen total seltsamen Fehler in PHP gesehen, und dann habe ich gemerkt, dass es ein Oktal gibt. Das <% (* & #> Oktal.

Kurz gesagt, ich habe einige Literale mit Nullen aufgefüllt, damit der Code ausgerichtet wird, ich weiß, ein großer Fehler. Vergaß die Oktale.

Die Frage ist, verwendet jemand Oktale für etwas anderes als Dateiberechtigungen? (Ich persönlich bevorzuge, chmod ugo+rwxaber ich verstehe, dass es nützlich ist, Oktale zu verwenden, wenn sie programmatisch generiert werden müssen.) Aber sind sie in einer anderen Situation nützlich?

Petruza
quelle
16
Option A: Gib dir die Schuld. Option B: Die Welt beschuldigen. Option C: Lachen, wenn Sie etwas gelernt haben.
Job
12
@Petrozza - IMO war die Verwendung einer führenden Null im C-Stil, um das Oktal anzuzeigen, nie eine gute Wahl, aber es ist Geschichte - wahrscheinlich ein bisschen C-Erbe, obwohl es vielleicht noch älter ist. Ich denke, Ada hat eine der besseren Konventionen - eine Oktalzahl würde 8 # 1234567 #, eine Hexadezimalzahl 16 # abcdef # usw. sein, und führende Nullen sind nur führende Nullen - jede Basis von 2 bis 16 (mindestens) ist gültig und alle sind visuell klar und leicht zu verstehen.
Steve314
2
@Petruza Ihre Frage war in seiner ursprünglichen Form für diese Seite nicht konstruktiv, und es wurde von der Gemeinde verbessert , so dass sie offen bleiben könnten: bitte die FAQ für weitere Informationen darüber , warum Menschen dies tun und warum wir es fördern. Wenn Sie weitere Fragen oder Bedenken haben, wenden Sie sich bitte an unsere Metadiskussionsseite , nicht an Ihre Frage.
11
Option D: "PHP beschuldigen" ist immer die richtige Wahl, unabhängig vom Problem
Kopffüßer
2
@ Steve314 da stimme ich voll zu. Ein weiteres bemerkenswertes Beispiel ist Python, wo sie das 0oPräfix haben (was konsistent 0xund 0bvielleicht etwas schwer zu unterscheiden ist 00). Und seit Python 3 sind zusätzliche führende Nullen ein Syntaxfehler, um diese Art von Fehlern zu verhindern.
5gon12eder

Antworten:

42

Laut Wikipedia sind Oktale nicht mehr so ​​häufig wie früher. Wie bereits erwähnt, verwendeten Systeme in der Vergangenheit ein 12/24/36-Bit-Wort, das eher in Oktalform als in Hexadezimalform dargestellt wird. Derzeit verwenden die x86- und i64-Architekturen jedoch ein 16/32/64-Bit Wort, das leichter hexadezimal und geradezu hässlich im Oktal dargestellt wird.

Gegenwärtige Verwendungen umfassen jedoch:

Beachten Sie, dass moderne Programmiersprachen aufgrund fehlender Anwendungsfälle und der Möglichkeit von Fehlern manchmal keine Oktale mehr unterstützen. C # ist ein Beispiel, wie Eric Lippert dies in der 3. und 4. Ausgabe von TCPL schrieb :

C # unterstützt aus zwei Gründen keine oktalen Literale. Erstens verwendet heutzutage kaum jemand oktale Literale. Zweitens: Wenn C # Oktal im Standardformat "Führende Null bedeutet Oktal" unterstützt, ist dies eine potenzielle Fehlerquelle. Betrachten Sie diesen Code:

    FlightNumber = 0541;

Dieser Ausdruck ist eindeutig als Dezimal-Literal und nicht als Oktal-Literal gedacht.

Verwandte und nur als Referenz und Neugier - Code, The Hidden Sprache Computer - Hardware verfügt über eine hervorragende einfach zu folgen Erläuterungen zu Oktal und andere Zahlensysteme auf Seite 55 - 63 .

Abel
quelle
1
Achten Sie in diesem Sinne beim Umgang mit Benutzereingaben auf Javascript. parseInt(011)==9
Darien
3
Das ist wirklich interessant an den Yuki und Pamean. Mir ist gerade eingefallen, dass die hexadezimale Fingerzählung einigermaßen einfach ist, wenn Sie die Innenseite jedes Fingers mit einer Variation wie dieser verwenden
ocodo
@ Slomojo - Sie können bis 99 an Ihren Fingern zählen , in der Tat ...
Detly
3
+1 für eine sehr umfassende Antwort. Grace Hopper sagte einmal, sie habe Probleme, ihr Scheckbuch auszugleichen, weil sie es so gut verstanden habe, im Oktal hinzuzufügen.
Macneil
14
@detly, wenn ich weiß, dass ich große Zahlen zählen muss, verwende ich meine 10 Ziffern als Bits und zähle mit nur meinen Fingern bis 1024 (pass nur auf, wem du # 4, # 128 & # 132 zeigst).
zzzzBov
17

Octal wurde vor etwa 50 Jahren häufig von Digital Equipment Corp. (DEC) und anderen Unternehmen verwendet, die Computer mit einem 12-Bit-Wort (z. B. PDP-8) oder einem anderen Vielfachen von sechs verwendeten, wie z. B. 18 und 36 (z. B. UNIVAC 1108) ). In der Grundschule habe ich sowohl den PDP-8 als auch den UNIVAC 1108 verwendet. Zeichen in beiden Maschinen verwendeten normalerweise sechs Bits, nicht 8.

PDP-8 Befehlsformat

PDP-8-Befehlsformat - beachten Sie, dass die Bits mit 0 -> 11 nummeriert sind. Bit 0 war das MSB (höchstwertiges Bit).

Als DEC mit dem 16-Bit-PDP-11 herauskam, verwendeten sie weiterhin Oktal in ihrer Dokumentation anstelle von Hexadezimalzahlen, wie sie von den anderen Minicomputerherstellern verwendet wurden, die zu dieser Zeit 16-Bit-Computer herausbrachten. Dies lag wahrscheinlich an den mehreren 3-Bit-Feldern in den PDP-11-Befehlsformaten wie Register, Mode und Src / Dest, die sich als Oktalziffer dekodieren ließen. (Vielen Dank an John Strohm für diesen Hinweis.)

Als Motorola seinen 68000-Mikroprozessor herausbrachte, der stark vom PDP-11 beeinflusst wurde und die gleichen 3-Bit-Modus- und -Registerfelder in den Anweisungen aufwies, entschied man sich interessanterweise dafür, in der Dokumentation nur Hexadezimalzahlen zu verwenden.

Da der PDP-11 die Oktalnotation verwendete, wurden auch die ursprünglichen Berechtigungscodes für Unix, die zuerst auf dem PDP-11 erschienen, als Oktalnotation verwendet. Dieses Erbe bleibt unter Linux bestehen, wo der Befehl chmod weiterhin octal verwendet, um jedes der drei Bit-Felder 'rwx' anzugeben.

Weitere Kleinigkeiten - CompuServe, das in den 1980er und frühen 1990er Jahren ein weit verbreiteter Online-Einwahldienst war (bevor es von AOL in den Schatten gestellt wurde), lief zumindest ursprünglich auf DEC-Minicomputern. Alle Benutzer-IDs waren numerisch, und irgendwann stellte ich fest, dass sie niemals 8er oder 9er enthielten, also waren sie oktal. Meine alte GUS-ID war 70205.

Tcrosley
quelle
1
Ihr Kommentar zur PDP-11-Dokumentation ist falsch. Der PDP-11 hatte 8 Register. R0-R5 waren Allzweckregister. R6 war der Stapelzeiger und R7 war der PC. Der MOV-Befehl nahm zwei 3-Bit-Registernummern und zwei 3-Bit-Adressierungsmodi an. Octal erfasst die Register- und Modusfelder PERFEKT. (Ich bezweifle stark, dass dies ein Unfall war.) Die Verwendung von Hex hätte alles verwirrt. PUSH und POP waren nur Adressierungsmodi, die R6 verwendeten. Sofortiger Operand war ein Adressierungsmodus, der R7 verwendete.
John R. Strohm
@ JohnR.Strohm Danke für den Kommentar zu den 3-Bit-Registern. Ich stimme Ihrer Analyse zu und habe meine Antwort aktualisiert.
Tcrosley
Also arbeitete DEC im OKT. Hätte nur ein Vielfaches von 3,32 Bit verwenden sollen, um Verwirrung zu vermeiden.
user234461
Es ist komisch, dass ich die Unix-Berechtigungen nie als eine Oktalzahl angesehen habe. Ich habe sie immer als drei einzelne Ziffern betrachtet, die jeweils die drei RWX-Bits repräsentieren, sodass sie oktal, dezimal oder sogar hexadezimal sein können.
Axl
11

Heathkit verwendete sie für das Frontpanel ihres H-8 und für Assembler-Listen ihrer Frontpanel-Software (genannt PAM-8). Dating mich, ich weiß.

Bildbeschreibung hier eingeben

Oktale sind heutzutage sehr selten; Jeder scheint Hex zu benutzen. Zahlen sehen jedoch immer noch wie oktale Zahlen aus, und Sie benötigen keine zusätzliche Tastenreihe für die Ziffern A bis F.

Robert Harvey
quelle
2
+1 für die H-8. Obwohl die CPU außen oktal war, war sie eine 8080A, die nur aus Bytes bestand. Geh figger.
Blrfl
Ich würde vermuten, dass sie Oktal für die Gemeinsamkeit mit der H-11 (die eine PDP-11-CPU hatte) verwendet.
Jerry Coffin
2
Der 8080 hatte 8-Bit-Bytes, aber der Befehlssatz machte mehr Sinn, wenn er in Oktal als in Hex betrachtet wurde.
RBerteig
6

Einer der Gründe für die Verwendung von octal sees ist, dass es sich um die größte Basis mit einer Potenz von 2 handelt, für die Sie keine Sonderzeichen benötigen. Das heißt, alle Ziffern können numerisch sein. Basis 16 (die nächste von Basis 8) erfordert nicht numerische Ziffern (normalerweise A, B, C, D, E, F).

tylerl
quelle
Ich weiß, dass dies alt ist, aber warum sollten Sie lieber nur numerische Ziffern als Buchstaben verwenden?
Petruza
5

Ich benutze jeden Tag Oktal. Jedes Mal, wenn ich eine Datei ändern muss, verwende ich octal (ich datiere die Notation u + r vor ...). Jedes Mal, wenn ich ein Steuerzeichen in einen String einbetten möchte, verwende ich Oktal ... (Ja, ich könnte Hex verwenden, aber Oktal ist das, was ich verwende).

Majenko
quelle
2
+1 für "aber Oktal ist, was ich benutze" :)
JoelFan
5

Jeder, der Kombinationen von Bits ausdrücken muss, die zu Dreien zusammengefasst sind.

Warum benutzt jemand Hex?


Dinge, die mir aus dem Kopf gehen und als Oktalzahlen ausgedrückt werden:

  • Von Mode 3A-Transpondern in Flugzeugen gequietschte Codes
  • Bestimmte Werte am Avionikbus ARINC 429
  • SCSI-Adressen
  • Schlüsselcodes in der ncursesBibliothek
Blrfl
quelle
11
Der Unterschied ist, hex ist "natürlich" wie ein halbes Byte. Zwei hexadezimale Ziffern = 1 Byte. Sie können Bytes jedoch nicht in Oktalzahlen aufteilen.
Mason Wheeler
2
Die erste Zeile gibt das Offensichtliche an. Der zweite macht eine schlechte Analogie.
back2dos
3
Und hex ist völlig unnatürlich für alles, was in Gruppen von drei Bits ausgedrückt werden muss, wie die oben erwähnten Unix-Dateimodi. Es gibt kein Gesetz, das besagt, dass die Ziffern eines bestimmten Nummerierungssystems mit den Bytes übereinstimmen müssen. Wenn dies der Fall wäre, wäre es eine schlechtere Praxis als bei der Basis 8, einem Computer etwas als Basis 10 auszudrücken, was sich zumindest an Bitgruppen ausrichtet.
Blrfl
6
Eine typische Hex-Zeichenfolge ist offensichtlich eine Hex-Zeichenfolge. Oktal ist nicht.
Paul Nathan
1
@Blrfl: Wie viele dieser erwähnten "[Dinge, die] in Gruppen von drei Bits ausgedrückt werden müssen" gibt es außer dem kanonischen Beispiel? Das ist die eigentliche Frage, die Sie bisher unbeantwortet gelassen haben. Stattdessen machen Sie noch eine schlechte Analogie. Es gibt eine tatsächliche Verwendung für die Dezimaldarstellung, da wir einfach gelernt haben, damit umzugehen. Welches berechnen Sie schneller? 7 * 6oder 07 * 06? Wir verwenden Dezimalzahlen, um die Zahlen so darzustellen, wie wir sie am besten verarbeiten können, und Hexadezimalzahlen, um die Zahlen so darzustellen, wie sie auf dem Computer gespeichert sind. Und wir machen das oft. Diese Seite ist voll mit Beweisen dafür.
back2dos
5

Als ich an CDC-Mainframes arbeitete (mit einem 60-Bit-Wort, 12-Bit-Wort für die PPU), wurden alle Core-Dumps und dergleichen in Oktalform (20 Oktalziffern pro Wort, 4 pro PPU-Wort) ausgeführt.

Jerry Sarg
quelle
3

Wie bei Hexadezimalzahlen wird auch bei der Angabe von Zeichencodes manchmal die Oktalnotation verwendet. Es kann aus dem gleichen Grund praktisch sein wie Hexadezimal: Es ist kompakter als Binär, aber sehr einfach in Binär in Ihrem Kopf zu übersetzen.

Caleb
quelle
2

Oktalzahlen lassen sich wie Hex einfach aus Binärzahlen konvertieren. Gruppieren Sie einfach die Binärziffern in Dreiergruppen, beginnend rechts.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)
Ed S.
quelle
7
Das ist offensichtlich. Die Frage ist, wann dies tatsächlich verwendet wird .
back2dos
2
@ back2dos: Dann kannst du gerne eine Antwort posten, anstatt den gleichen Kommentar mehrmals zu hinterlassen.
Ed S.
4
@Ed S. Sie haben nicht einmal versucht, die Frage zu beantworten. Sie haben etwas Offensichtliches gesagt, auf das das Original-Poster mit ziemlicher Sicherheit bereits die Antwort wusste. Wie die Moderatoren gerne sagen, ist dies nicht das, wonach wir drehen. Weitere Informationen finden Sie unter meta.programmers.stackexchange.com/questions/1968/… .
btilly
@ back2dos, btilly - Antworten auf Stackexhange-Sites sind nicht nur für das OP bestimmt, sie werden zu einer dauerhaften Ressource für jeden Leser, der vorbeikommt. Alle offensichtlichen Tatsachen sind nicht unbedingt für alle offensichtlich, wenn diese Antwort dem Penny-Drop für jemanden hilft, den es wertvoll macht.
Ocodo
2
@ Slomojo Durch dieses Argument kann jede Frage zu einem Wiki für jeden verwandten Aspekt eines Themas werden. Der Punkt ist, dass dies die Frage nicht beantwortet . Diese Antwort kann sicherlich an einer anderen Stelle gültig sein: "Wie kann man geistig schnell zu einem Oktal konvertieren?"
Nicole
2

Nee. Ich habe sie nie benutzt. Nicht einmal zum Festlegen von Dateiberechtigungen, weil ich es so selten mache, dass ich es schwer zu lesen finde.

Also ja, es gibt den offensichtlichen Vorteil der Konvertierung von und nach binär.
Wie von @Mason bereits erwähnt, ist hex weitaus "natürlicher", da 2 hexadezimale Ziffern ein Byte ergeben. Es ist praktisch, 24/32 Bit RGB / ARGB-Farben, IP-Adressen, Byte-Masken usw. darzustellen. Octal auf der anderen Seite ist nicht wirklich praktisch, da Sie selten Szenarien haben, in denen Sie in 3-Bit-Gruppen arbeiten.

Dateiberechtigungen sind in der Tat das einzige, woran ich denken könnte. Und wenn es ab sofort kein Einsatzgebiet gibt, wird es wohl nie eines geben. Seitdem der Platz in den letzten 20 Jahren so billig geworden ist, ist es sehr ungewöhnlich geworden, Informationen auf Kosten der Ausrichtung, der Benutzerfreundlichkeit und der Erweiterbarkeit so eng zu packen.

back2dos
quelle
2

Ein bisschen abseits, aber eine öffentliche Nutzung findet in der Londoner U-Bahn statt. Jeder Zug hat sowohl eine physische Identität als auch eine separate Identität in den Fahrplänen, die im Betrieb angezeigt wird - siehe hier: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (beachten Sie die 402 oben in der Zielanzeige ). Obwohl die Elektronik für die Displays standardmäßig dezimal arbeitet, werden die Ziffern 8 oder 9 nie angezeigt, da sie mit der älteren, auf Oktalen basierenden Hardware im Signalsystem verknüpft sind.

Julia Hayward
quelle