552 Stimmen

Warum wird hexadezimalen Zahlen das Zeichen 0x vorangestellt?

Warum werden hexadezimale Zahlen mit dem Präfix 0x ? Ich verstehe die Verwendung des Präfixes, aber ich verstehe nicht die Bedeutung, warum 0x gewählt wurde.

578voto

Řrřola Punkte 5527

Kurze Geschichte: Die 0 teilt dem Parser mit, dass es sich um eine Konstante handelt (und nicht um einen Bezeichner/ein reserviertes Wort). Es wird immer noch etwas benötigt, um die Zahlenbasis anzugeben: die x ist eine willkürliche Wahl.

Lange Geschichte: In den 60er Jahren waren die vorherrschenden Zahlensysteme für die Programmierung das Dezimalsystem und oktal - Mainframes hatten 12, 24 oder 36 Bits pro Byte, was gut durch 3 = log2(8) teilbar ist.

Die Sprache BCPL verwendet die Syntax 8 1234 für Oktalzahlen. Als Ken Thompson B aus BCPL entwickelte, verwendete er die 0 stattdessen das Präfix. Das ist großartig, denn

  1. eine Integer-Konstante besteht jetzt immer aus einem einzigen Token,
  2. kann der Parser trotzdem sofort erkennen, dass es sich um eine Konstante handelt,
  3. kann der Parser sofort die Basis ( 0 ist in beiden Basen gleich),
  4. es ist mathematisch vernünftig ( 00005 == 05 ), und
  5. werden keine wertvollen Sonderzeichen benötigt (wie in #123 ).

Als C aus B entwickelt wurde, entstand der Bedarf an hexadezimalen Zahlen (die PDP-11 hatte 16-Bit-Worte) und alle oben genannten Punkte waren immer noch gültig. Denn für andere Maschinen wurden weiterhin Oktale benötigt, 0x wurde willkürlich gewählt ( 00 wurde wahrscheinlich als ungeschickt verworfen).

C# ist ein Nachkomme von C und erbt daher die Syntax.

119voto

AshleysBrain Punkte 21511

Hinweis: Ich kenne die richtige Antwort nicht, aber das Folgende ist nur meine persönliche Spekulation!

Wie bereits erwähnt, bedeutet eine 0 vor einer Zahl, dass sie oktal ist:

04524 // octal, leading 0

Stellen Sie sich vor, Sie müssen ein System zur Bezeichnung von Hexadezimalzahlen entwickeln, und beachten Sie, dass wir in einer Umgebung im Stil von C arbeiten. Wie wäre es, wenn wir wie bei Assembly mit h enden? Leider geht das nicht - es würde Ihnen erlauben, Token zu bilden, die gültige Bezeichner sind (z.B. könnten Sie eine Variable gleich benennen), was zu einigen unangenehmen Mehrdeutigkeiten führen würde.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

Aus dem gleichen Grund kann man nicht mit einer Figur führen:

xFF00 // also valid identifier

Die Verwendung eines Hashwerts wurde wahrscheinlich verworfen, weil es zu Konflikten mit dem Präprozessor kommt:

#define ...
#FF00 // invalid preprocessor token?

Aus welchen Gründen auch immer hat man sich schließlich entschlossen, ein x hinter eine führende 0 zu setzen, um hexadezimal zu bezeichnen. Es ist eindeutig, da es immer noch mit einem Zahlenzeichen beginnt, also kein gültiger Bezeichner sein kann, und basiert wahrscheinlich auf der Oktal-Konvention einer führenden 0.

0xFF00 // definitely not an identifier!

40voto

loyola Punkte 3611

Es ist ein Präfix, das angibt, dass die Zahl in hexadezimaler Form und nicht in einer anderen Basis angegeben ist. Die Programmiersprache C verwendet es, um den Compiler zu informieren.

Beispiel:

0x6400 heißt übersetzt 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Wenn der Compiler liest 0x6400 Es versteht die Zahl als Hexadezimalzahl mit Hilfe von 0x Begriff. Normalerweise können wir unter (6400) verstehen 16 oder (6400) 8 oder was auch immer ..

Für binär wäre es:

0b00000001

Ich hoffe, ich konnte Ihnen irgendwie helfen.

Guten Tag!

21voto

Johnny Low Punkte 167

Die vorangestellte 0 wird verwendet, um eine Zahl zur Basis 2, 8 oder 16 anzugeben.

Meiner Meinung nach wurde 0x als Hexadezimalzeichen gewählt, weil "x" wie Hex klingt.

Das ist nur meine Meinung, aber ich denke, es ist sinnvoll.

Guten Tag!

14voto

Advait Junnarkar Punkte 2212

Ich kenne die historischen Gründe nicht. 0x als Präfix zur Bezeichnung von Hexadezimalzahlen - denn es hätte sicherlich viele Formen annehmen können. Diese besondere Form des Präfixes stammt aus den Anfängen der Computerwissenschaft.

Da wir an Dezimalzahlen gewöhnt sind, ist es normalerweise nicht nötig, die Basis/Radix . Für Programmierzwecke müssen wir jedoch oft zwischen den Basen binär (Basis-2), oktal (Basis-8), dezimal (Basis-10) und hexadezimal (Basis-16) - als die am häufigsten verwendeten Zahlenbasen - unterscheiden.

Zu diesem Zeitpunkt ist es eine Konvention, um die Basis einer Zahl zu bezeichnen. Ich habe die Zahl 29 in allen oben genannten Basen mit ihren Präfixen geschrieben:

  • 0b11101 : Binär
  • 0o35 : Oktal, gekennzeichnet durch ein o
  • 0d29 : Dezimal, dies ist ungewöhnlich, da wir davon ausgehen, dass Zahlen ohne Vorzeichen dezimal sind.
  • 0x1D : Hexadezimal

Grundsätzlich wird ein Alphabet, das wir üblicherweise mit einer Basis assoziieren (z. B. b für binär), kombiniert mit 0 um die Basis einer Zahl leicht zu unterscheiden.

Dies ist besonders hilfreich, weil kleinere Zahlen in allen Basen verwirrend gleich aussehen können: 0b1, 0o1, 0d1, 0x1.

Wenn Sie einen Rich-Text-Editor verwenden, können Sie alternativ auch tiefgestellte Buchstaben verwenden, um Basen zu kennzeichnen: 1 2 , 1 8 , 1 10 , 1 16

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