Waarom worden hexadecimale getallen voorafgegaan door 0x
?
Ik begrijp het gebruik van het voorvoegsel, maar ik begrijp niet waarom 0x
is gekozen.
Antwoord 1, autoriteit 100%
Kort verhaal:de 0
vertelt 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 x
is 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 1234
voor octale getallen. Toen Ken Thompson B creëerde op basis van BCPL, gebruikte hij in plaats daarvan het voorvoegsel 0
. Dit is geweldig omdat
- een geheel getalconstante bestaat nu altijd uit een enkele token,
- de parser kan nog steeds meteen zien dat het een constante heeft,
- de parser kan de basis onmiddellijk zien (
0
is hetzelfde in beide basen), - het is wiskundig gezond (
00005 == 05
), en - 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 0x
willekeurig gekozen (00
werd 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:
0x6400
vertaalt naar 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Wanneer de compiler 0x6400
leest, 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 0x
niet 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
: binair0o35
: Octaal, aangegeven met een o0d29
: Decimaal, dit is ongebruikelijk omdat we aannemen dat getallen zonder voorvoegsel decimaal zijn0x1D
: Hexadecimaal
Kortom, een alfabet dat we meestal associëren met een grondtal (bijv. b voor binair) wordt gecombineerd met 0
om 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