Warum wird hexadezimalen Zahlen 0x vorangestellt?

Lesezeit: 8 Minuten

Benutzeravatar von unj2
unj2

Warum werden Hexadezimalzahlen als vorangestellt? 0x? Ich verstehe die Verwendung des Präfixes, aber ich verstehe nicht die Bedeutung des Warum 0x wurde gewählt.

  • Jetzt stelle ich fest, dass Titel und Text zwei völlig unterschiedliche Fragen stellen. Die meisten Antworten konzentrieren sich auf die Frage im Titel. Die Antwort auf die Frage im Text lautet einfach “es bedeutet nichts – es ist lediglich ein Präfix, das dem Compiler mitteilt, dass die Ganzzahl hexadezimal geschrieben ist”.

    – Andreas Rejbrand

    22. April 2010 um 23:39 Uhr

  • Um pedantisch zu sein, könnte man die Frage im Titel auch auf zwei verschiedene Arten interpretieren: 1) “Warum wird hexadezimalen Zahlen das Präfix 0x vorangestellt, im Gegensatz zu jedem anderen Präfix oder Indikator?” 2) “Warum müssen wir bei der Eingabe von Hexadezimalzahlen ein Präfix verwenden? Der Compiler wird doch 58A auch ohne Präfix als Hexadezimalzahl erkennen?” Die Antwort auf die zweite Interpretation der Frage ist trivial. „123“ ist ebenfalls eine Hexadezimalzahl.

    – Andreas Rejbrand

    22. April 2010 um 23:42 Uhr

  • Warum bezeichnet das Präfix 0x eine Hex-Zahl anstelle von 0h?

    – DawnSong

    6. September 2021 um 14:35 Uhr

Kurzgeschichte: Das 0 teilt dem Parser mit, dass es sich um eine Konstante handelt (und nicht um einen Bezeichner/ein reserviertes Wort). Etwas wird noch benötigt, um die Zahlenbasis zu spezifizieren: die x ist eine willkürliche Wahl.

Lange Geschichte: In den 60er Jahren waren die vorherrschenden Programmierungszahlensysteme dezimal und oktal — Mainframes hatten 12, 24 oder 36 Bit pro Byte, was gut durch 3 = log2(8) teilbar ist.

Die BCPL-Sprache verwendete die Syntax 8 1234 für Oktalzahlen. Als Ken Thompson B aus BCPL erstellte, verwendete er die 0 Präfix statt. Das ist großartig, weil

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

Als C aus B erstellt wurde, entstand die Notwendigkeit für Hexadezimalzahlen (der PDP-11 hatte 16-Bit-Wörter) und alle oben genannten Punkte waren immer noch gültig. Da für andere Maschinen noch Oktale benötigt wurden, 0x wurde willkürlich gewählt (00 wurde wahrscheinlich als umständlich ausgeschlossen).

C# ist ein Nachkomme von C, erbt also die Syntax.

  • Ich denke nicht 0x Über 00 war Präferenz/Unbequemlichkeit. 00 würde bestehenden Code brechen. 0010 wie oktal ist 8während 0010 wie hexadezimal wäre 16. Sie konnten keine Zahl als zweiten Ziffernindikator verwenden (außer 8 oder 9, und beide haben keine Bedeutung in Bezug auf hexadezimal), daher ist ein Buchstabe ein Muss. Und das lässt entweder 0h oder 0x (H e X Dezimalzahl). Von diesem Punkt an scheint es wirklich zurück zur Präferenz zu gehen.

    – GManNickG

    12. Januar 2013 um 2:30 Uhr


  • Verwandte: stackoverflow.com/questions/18987911/… und stackoverflow.com/questions/11483216/…

    – Řrřola

    10. Juni 2014 um 13:13 Uhr

  • Verwendung einer 0 Präfix für Oktal hat im Laufe der Jahre so viele Probleme verursacht. Vor allem in Ländern wie Großbritannien, wo Telefonnummern mit a beginnen 0. Javascript und viele andere Sprachen würden diese als oktal analysieren und die Zahl vor dem Speichern verstümmeln. Um den Spaß noch zu steigern, würde ein beliebtes Datenbankprodukt schweigend Wechseln Sie zurück zur Dezimalanalyse, wenn die Zahl ein enthielt 8 oder 9.

    – Basic

    24. November 2015 um 19:45 Uhr


  • 12, 24 und 36 sind auch durch 4 teilbar, warum haben sie dafür nicht an Hexadezimalzahlen gedacht?

    – phuklv

    26. Januar 2017 um 6:33 Uhr

  • @LưuVĩnhPhúc Wahrscheinlich, weil Hexadezimal nicht sehr relevant war. Der größte Teil der Hardware, Software und Dokumentation der damaligen Zeit passte oktal viel besser. BCPL wurde erstmals auf einem implementiert 36-Bit-IBM 7094, mit einem Befehlsformat, das in zwei 3-Bit-Teile und 2 15-Bit-Teile aufgeteilt ist; 6-Bit-Zeichen; und Dokumentation in oktal. Die frühen Implementierungen von B waren auf einem PDP-7 (18 Bit) und einem Honeywell GE-945 (36 Bit, aber mit 18-Bit-Adressierung und Unterstützung für 6- und 9-Bit-Bytes). Der 16-Bit-PDP-11 kam nach B heraus, hätte also das Design von B nicht sehr beeinflusst.

    – 8bittree

    17. Februar 2017 um 19:09 Uhr

Benutzeravatar von AshleysBrain
Ashleys Gehirn

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üssten ein System zur Bezeichnung von Hexadezimalzahlen entwickeln, und beachten Sie, dass wir in einer Umgebung im C-Stil arbeiten. Wie wäre es, mit h wie Montage zu enden? Leider können Sie das nicht – es würde Ihnen erlauben, Token zu erstellen, 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?

Sie können aus demselben Grund nicht mit einem Charakter führen:

xFF00 // also valid identifier

Die Verwendung eines Hashs wurde wahrscheinlich verworfen, weil er mit dem Präprozessor in Konflikt steht:

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

Am Ende entschieden sie sich aus irgendeinem Grund, ein x nach einer führenden 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 wahrscheinlich auf der Oktalkonvention einer führenden 0 basiert.

0xFF00 // definitely not an identifier!

  • Interessant. Ich stelle mir vor, sie hätten eine führende 0 UND ein nachgestelltes h verwenden können, um Hex zu bezeichnen. Das nachgestellte h wäre wahrscheinlich mit dem Typspezifizierer-Suffix verwechselt worden, zB 0xFF00l vs. 0FF00hl

    – zdan

    20. April 2010 um 0:24 Uhr

  • Dieses Argument impliziert, dass die Verwendung einer führenden Null zur Kennzeichnung von Oktalzahlen vor der Verwendung des hexadezimalen Präfixes „0x“ liegt. Ist das wahr?

    – Andreas Rejbrand

    22. April 2010 um 13:09 Uhr

  • Wären sie nicht beide gleichzeitig erfunden worden? Warum sollte es jemals das eine geben, aber nicht das andere?

    – Ashleys Gehirn

    22. April 2010 um 13:28 Uhr

  • AshleysBrain siehe Antwort von @Řrřola, warum es oktal, aber nicht gleichzeitig hexadezimal sein könnte.

    – jv42

    27. Januar 2012 um 9:11 Uhr

  • @zdan sie haben es vor langer Zeit benutzt. In der x86-Intel-Assembly muss einem Hex-Literal immer eine 0 vorangestellt werden, wenn es mit einem Zeichen beginnt. Zum Beispiel 0xFFAB1234 muss geschrieben werden als 0FFAB1234h. Ich erinnere mich an Inline asm in Pascal, als ich jung war. stackoverflow.com/q/11733731/995714

    – phuklv

    11. Oktober 2015 um 3:34 Uhr

Benutzeravatar von loyola
Loyola

Es ist ein Präfix, um anzuzeigen, dass die Zahl hexadezimal und nicht in einer anderen Basis ist. Die Programmiersprache verwendet es, um es dem Compiler mitzuteilen.

Beispiel:

0x6400 wird übersetzt in 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Wenn der Compiler liest 0x6400Es versteht die Zahl ist hexadezimal mit Hilfe von 0x Begriff. Normalerweise verstehen wir unter (6400)16 oder (6400)8 oder Wasauchimmer ..

Zum binär es wäre:

0b00000001

Schönen Tag!

  • Binäre Literale werden in C++ erst seit C++14 und überhaupt nicht in C unterstützt.

    – Ruslan

    25. April 2017 um 13:11 Uhr

  • Das erklärt nicht warum. Insbesondere, warum konnten Sie das erste Beispiel nicht als schreiben x6400? Das x könnte immer noch verwendet werden, um hexadezimal abzuleiten.

    – Aaron Franke

    7. November 2019 um 4:57 Uhr

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

Meiner Meinung nach wurde 0x gewählt, um Hex anzuzeigen, weil ‘x’ wie Hex klingt.

Nur meine Meinung, aber ich denke, es macht Sinn.

Guten Tag!

Ich kenne die historischen Gründe dafür nicht 0x als Präfix für Hexadezimalzahlen – da es sicherlich viele Formen hätte annehmen können. Dieser besondere Präfixstil stammt aus den Anfängen der Informatik.

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

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

  • 0b11101: Binär
  • 0o35: Oktal, gekennzeichnet durch ein o
  • 0d29: Dezimal, das ist ungewöhnlich, weil wir davon ausgehen, dass Zahlen ohne Präfix dezimal sind
  • 0x1D: Hexadezimal

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

Dies ist besonders hilfreich, da kleinere Zahlen verwirrenderweise in allen Basen gleich erscheinen können: 0b1, 0o1, 0d1, 0x1.

Wenn Sie jedoch einen Rich-Text-Editor verwenden, können Sie alternativ den Index verwenden, um Basen zu bezeichnen: 1218110116

  • Warum wird 0h nicht für Hex gewählt? 0x scheint seltsam.

    – DawnSong

    6. September 2021 um 14:34 Uhr

  • @DawnSong Es ist nur eine Konvention, die sehr beliebt ist, und jetzt müssen wir damit leben. Manchmal sind diese Dinge willkürlich. Sie könnten versuchen, auf Ihre Weise zu werben, aber es ist schwer, die Gewohnheiten so vieler Menschen zu ändern. Ich finde das Oktal optisch am verwirrendsten.

    – Advait Junnarkar

    8. September 2021 um 5:46 Uhr

  • Warum wird 0h nicht für Hex gewählt? 0x scheint seltsam.

    – DawnSong

    6. September 2021 um 14:34 Uhr

  • @DawnSong Es ist nur eine Konvention, die sehr beliebt ist, und jetzt müssen wir damit leben. Manchmal sind diese Dinge willkürlich. Sie könnten versuchen, auf Ihre Weise zu werben, aber es ist schwer, die Gewohnheiten so vieler Menschen zu ändern. Ich finde das Oktal optisch am verwirrendsten.

    – Advait Junnarkar

    8. September 2021 um 5:46 Uhr

1428000cookie-checkWarum wird hexadezimalen Zahlen 0x vorangestellt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy