Waarom worden hexadecimale getallen voorafgegaan door 0x?

Waarom worden hexadecimale getallen voorafgegaan door 0x?
Ik begrijp het gebruik van het voorvoegsel, maar ik begrijp niet waarom 0xis gekozen.


Antwoord 1, autoriteit 100%

Kort verhaal:de 0vertelt de parser dat het te maken heeft met een constante (en niet een identifier/gereserveerd woord). Er is nog iets nodig om de nummerbasis te specificeren: de xis een willekeurige keuze.

Lang verhaal:in de jaren 60 waren de meest voorkomende programmeernummersystemen decimaal en octaal– mainframes hadden 12, 24 of 36 bits per byte, wat mooi deelbaar is door 3 = log2(8).

De BCPL-taal gebruikte de syntaxis 8 1234voor octale getallen. Toen Ken Thompson B creëerde op basis van BCPL, gebruikte hij in plaats daarvan het voorvoegsel 0. Dit is geweldig omdat

  1. een geheel getalconstante bestaat nu altijd uit een enkele token,
  2. de parser kan nog steeds meteen zien dat het een constante heeft,
  3. de parser kan de basis onmiddellijk zien (0is hetzelfde in beide basen),
  4. het is wiskundig gezond (00005 == 05), en
  5. er zijn geen kostbare speciale tekens nodig (zoals in #123).

Toen C werd gemaakt van B, ontstond de behoefte aan hexadecimale getallen (de PDP-11 had 16-bits woorden) en alle bovenstaande punten waren nog steeds geldig. Aangezien octalen nog steeds nodig waren voor andere machines, werd 0xwillekeurig gekozen (00werd waarschijnlijk uitgesloten als onhandig).

C# is een afstammeling van C, dus het neemt de syntaxis over.


Antwoord 2, autoriteit 21%

Opmerking: ik weet het juiste antwoord niet, maar het onderstaande is slechts mijn persoonlijke speculatie!

Zoals is vermeld, betekent een 0 voor een getal dat het octaal is:

04524 // octal, leading 0

Stel je voor dat we een systeem moeten bedenken om hexadecimale getallen aan te duiden, en merk op dat we in een C-achtige omgeving werken. Wat dacht je van eindigen met h like assembly? Helaas kunt u dat niet – het zou u in staat stellen tokens te maken die geldige identifiers zijn (u zou bijvoorbeeld een variabele hetzelfde kunnen noemen), wat voor vervelende dubbelzinnigheden zou zorgen.

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

Je kunt om dezelfde reden niet leiden met een personage:

xFF00 // also valid identifier

Het gebruik van een hash is waarschijnlijk weggegooid omdat het in strijd is met de preprocessor:

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

Uiteindelijk hebben ze, om wat voor reden dan ook, besloten om een x achter een leidende 0 te plaatsen om hexadecimaal aan te duiden. Het is ondubbelzinnig omdat het nog steeds begint met een numeriek teken, dus het kan geen geldige identificatie zijn, en is waarschijnlijk gebaseerd op de octale conventie van een voorloop 0.

0xFF00 // definitely not an identifier!

Antwoord 3, autoriteit 6%

Het is een voorvoegsel om aan te geven dat het getal hexadecimaal is in plaats van een andere basis. De programmeertaal C gebruikt het om de compiler te vertellen.

Voorbeeld:

0x6400vertaalt naar 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Wanneer de compiler 0x6400leest, begrijpt hij dat het getal hexadecimaal is met behulp van de term 0x. Meestal kunnen we begrijpen door (6400)16of (6400)8of wat dan ook..

Voor binairzou dit zijn:

0b00000001

Ik hoop dat ik op de een of andere manier heb geholpen.

Goedendag!


Antwoord 4, autoriteit 3%

De voorgaande 0 wordt gebruikt om een getal in grondtal 2, 8 of 16 aan te geven.

Naar mijn mening is 0x gekozen om hex aan te geven omdat ‘x’ klinkt als hex.

Gewoon mijn mening, maar ik denk dat het logisch is.

Goede dag!


Antwoord 5

Ik ken de historische redenen achter 0xniet als prefix om hexadecimale getallen aan te duiden – aangezien het zeker vele vormen had kunnen aannemen. Deze specifieke voorvoegselstijl stamt uit de begindagen van de informatica.

Omdat we gewend zijn aan decimale getallen, is het meestal niet nodig om de grondtal/radixaan te geven. Voor programmeerdoeleinden moeten we echter vaak de basen onderscheiden van binair (base-2), octaal (base-8), decimaal (base-10) en hexadecimaal (base-16) – als de meest gebruikte getalbases.

Op dit moment is het een conventie die wordt gebruikt om de basis van een getal aan te duiden. Ik heb het getal 29 in alle bovenstaande basen geschreven met hun voorvoegsels:

  • 0b11101: binair
  • 0o35: Octaal, aangegeven met een o
  • 0d29: Decimaal, dit is ongebruikelijk omdat we aannemen dat getallen zonder voorvoegsel decimaal zijn
  • 0x1D: Hexadecimaal

Kortom, een alfabet dat we meestal associëren met een grondtal (bijv. b voor binair) wordt gecombineerd met 0om de grondtal van een getal gemakkelijk te kunnen onderscheiden.

Dit is vooral handig omdat kleinere getallen verwarrend genoeg hetzelfde kunnen lijken in alle basen: 0b1, 0o1, 0d1, 0x1.

Als je echter een rich text-editor gebruikte, zou je ook subscript kunnen gebruiken om basen aan te duiden: 12, 18, 110, 116

Other episodes