51 Stimmen

Oktalzahl-Literale: Wann? Warum? Immer?

Ich habe noch nie Oktalzahlen in meinem Code verwendet und bin auch noch nie auf einen Code gestoßen, der sie verwendet hat (trotz Hexadezimalzahlen und Bitverdreher).

Ich habe etwa 1994 mit der Programmierung in C/C++ begonnen, vielleicht bin ich also zu jung für diese Aufgabe? Verwendet älterer Code Oktalzahlen? C unterstützt diese durch das Voranstellen einer 0, aber wo ist der Code, der diese Basis-8-Zahlenliterale verwendet?

31 Stimmen

Ich verwende sie (in Form von oktalen Nullen) ständig: if (b < 0) b = 0;

2 Stimmen

@pmg: Ich frage mich, ob es schwierig wäre, 0q1234 als das "richtige" Format für Oktal-Konstanten ungleich Null zu definieren und 01234 explizit mit der Empfehlung zu deprivatisieren, dass Compiler eine nicht-fatale Diagnose erzeugen? Eigentlich würde ich gerne ein allgemeines Bit-basiertes Format 0[[x[0-9A-Fa-f]+]|[q[0-7]+]|[w[0-3]+]|[v[0-1]+]]+ sehen, um eine Mischung aus 1-4-Bit-Feldern zu ermöglichen, da 3-Bit-Felder nicht immer ein Vielfaches von 3 Bits von rechts ausgerichtet sind.

0 Stimmen

Zufälligerweise erschien diese Frage heute auf der Titelseite von SO (jemand fügte eine Antwort hinzu), und Raymond Chen veröffentlichte heute zufällig auch einen Artikel über das oktale Chaos: Der Fluch der führenden Null

54voto

Ben Collins Punkte 20125

Ich musste kürzlich einen Netzwerkprotokollcode schreiben, der auf 3-Bit-Felder zugreift. Oktal ist sehr nützlich, wenn man das debuggen will.

Können Sie mir sagen, was die 3-Bit-Felder davon sind?

0x492492

Andererseits dieselbe Zahl in oktal:

022222222

Und nun endlich in binärer Form (in 3er-Gruppen):

010 010 010 010 010 010 010 010

0 Stimmen

Ich habe Ihre Antwort in einer ähnlichen Frage bei Programmers Exchange erwähnt und sie weiter ausgeführt, was vielleicht für andere, die sich für Oktale interessieren, von Interesse ist: programmers.stackexchange.com/questions/98692/

1 Stimmen

Richtig, aber sie werden normalerweise nur bei bestehenden Protokollen verwendet, die 3-Bit-Gruppen oder ein Vielfaches davon verwenden. Alle neuen Codes und Protokolle verwenden normalerweise nybbles oder ein Vielfaches davon, in der Regel in Hex angegeben.

3 Stimmen

@mirabilos Das ist eine ziemlich pauschale Aussage. Es gibt keinen Grund, sich auf Feldlängen als Vielfache von 4 oder 8 Bit festzulegen - tatsächlich kann der Ausschluss anderer Längen eine Menge Overhead im Protokoll verursachen. Für einige Anwendungen spielt das vielleicht keine Rolle, aber was ist mit Protokollen, die eine Anwendung unterstützen, für die Leistung wirklich wichtig ist? In diesen Fällen würde man kein 4-Bit-Feld wählen, wenn ein 3-Bit-Feld ausreicht.

37voto

Chris AtLee Punkte 7358

Der einzige Ort, an dem ich heutzutage auf Oktal-Literale stoße, ist der Umgang mit den Berechtigungsbits für Dateien in Linux, die normalerweise als 3 Oktalziffern dargestellt werden, wobei jede Ziffer die Berechtigungen für den Dateibesitzer, die Gruppe und andere Benutzer darstellt.

z.B. 0755 (bei den meisten Kommandozeilenprogrammen auch nur 755) bedeutet, dass der Dateieigentümer volle Rechte hat (Lesen, Schreiben, Ausführen), während die Gruppe und andere Benutzer nur Lese- und Ausführungsrechte haben.

Die Darstellung dieser Bits in oktaler Form macht es einfacher, herauszufinden, welche Berechtigungen gesetzt sind. Sie können auf einen Blick erkennen, was 0755 bedeutet, aber nicht 493 oder 0x1ed.

0 Stimmen

Auch IPC-Ressourcen wie Semaphoren und gemeinsamer Speicher. uw714doc.sco.com/de/SDK_sysprog/_Getting_Semaphores.html#ipc_i8

30voto

Adam Davis Punkte 89506

Desde Wikipedia

Zu der Zeit, als das Oktal ursprünglich in der Datenverarbeitung weit verbreitet wurde, Systeme wie die IBM-Mainframes 24-Bit- (oder 36-Bit-) Wörter verwendet. Oktal war eine ideale Abkürzung von für diese Maschinen, weil acht (oder zwölf) Ziffern eine ganze ein ganzes Maschinenwort prägnant darstellen Maschinenwort darstellen (jede Oktalziffer umfasst drei binäre Ziffern). Außerdem wurden die Kosten gesenkt durch Nixie-Röhren, Sieben-Segment-Anzeigen Sieben-Segment-Anzeigen und Taschenrechner verwendet werden konnten für die Bedienerkonsolen verwendet werden; wo binäre Anzeigen zu komplex waren, um zu komplex waren, benötigten dezimale Anzeigen komplexe Hardware für die Umwandlung von Radixen, und hexadezimale Anzeigen benötigten zur Darstellung Buchstaben.

Alle modernen Datenverarbeitungssysteme Plattformen verwenden jedoch 16-, 32-, oder 64-Bit-Wörter, wobei acht Bits ein ein Byte bilden. Auf solchen Systemen würden drei oktale Ziffern erforderlich, wobei die höchstwertige Oktalziffer uneleganterweise nur zwei Binärziffern darstellt (und in einer Reihe die gleiche Oktalziffer eine Binärziffer eine Binärziffer des nächsten Bytes). Daher wird das Hexadezimalsystem heute üblicherweise heute in Programmiersprachen verwendet, da eine Hexadezimalziffer vier Binärziffern abdeckt vier binäre Ziffern umfasst und alle modernen Computer Computerplattformen haben Maschinenwörter, die gleichmäßig durch vier teilbar sind. Einige Plattformen mit einer Zweierpotenz der Wortgröße Wortgröße haben immer noch Befehlsunterwörter die leichter zu verstehen sind, wenn sie oktal angezeigt werden; dazu gehört die PDP-11. Die heute allgegenwärtige x86 Architektur gehört ebenfalls zu dieser Kategorie auch zu dieser Kategorie, aber Oktal wird fast nie auf dieser Plattform verwendet.

-Adam

27voto

Tim Punkte 8867

Ich habe in meiner Arbeit noch nie Oktalzahlen verwendet. Code verwendet und bin auch keinem Code begegnet, der verwendet.

Ich wette, das haben Sie. Nach der Norm sind numerische Literale, die mit Null beginnen, oktal. Dies schließt trivialerweise ein, 0 . Jedes Mal, wenn Sie eine buchstäbliche Null verwendet oder gesehen haben, war diese oktal. Seltsam, aber wahr :-)

4 Stimmen

Dies ist faktisch nicht der Fall. Oktal beginnt mit der '0' als Bezeichner. Genauso wie '0x' keine gültige Zahl ist, ist '0' keine Oktalzahl. Die '00' schon.

10 Stimmen

Ich glaube, Sie könnten sich irren. In Abschnitt 6.4.4.1 von ISO/IEC 9899:201x wird die Form von literalen Konstanten spezifiziert, und 0 wird ausdrücklich als oktale Konstante aufgeführt. Außerdem können Dezimalkonstanten nicht mit einer Null beginnen. Sie können einen Entwurf dieser Norm online einsehen aquí .

5 Stimmen

@LucBloom 0 sachlich es oktal. Siehe Ist 0 ein Dezimal- oder ein Oktal-Literal?

9voto

Samuel Lee Punkte 81

In der kommerziellen Luftfahrt werden im ehrwürdigen Busstandard Arinc 429 oktale "Labels" (im Wesentlichen Nachrichtentyp-IDs) verwendet. So in der Lage sein, Label-Werte in oktalen angeben, wenn das Schreiben von Code für Avionik-Anwendungen ist nett...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X