Domanda

Dopo tutto questo tempo, non ho mai pensato di fare questa domanda; Capisco che questo è venuto da C ++, ma quello che era il ragionamento dietro di esso:

  • specificare i numeri decimali come te normalmente
  • specificare i numeri ottali da un primario 0
  • Specificare numeri esadecimali da un 0x

Perché 0? Perché 0x? C'è una progressione naturale per la base-32?

È stato utile?

Soluzione

C, l'antenato di C ++ e Java, è stato originariamente sviluppato da Dennis Ritchie il PDP-8 nei primi anni '70. Quelle macchine avevano una 12-bit spazio di indirizzamento , così puntatori (indirizzi) erano lunghe 12 bit e più comodamente rappresentata nel codice da tre cifre ottali 4 bit (prima parola indirizzabile sarebbe 000octal, ultima parola 777octal indirizzabile).

ottale non mappa bene a 8 bit byte perché ogni cifra ottale rappresenta tre bit, quindi ci sarà sempre bit in eccesso rappresentabili in notazione ottale. Un byte all-TRUE-bit (1111 1111) è 377 in ottale, ma FF esadecimale.

Hex è più facile per la maggior parte delle persone di convertire da e verso binario nella loro testa, dal momento che i numeri binari sono di solito espresse in blocchi di otto (perché questa è la dimensione di un byte) ed otto è esattamente due cifre esadecimali, ma Hex avrebbe fatto sono stati goffo e fuorviante nel tempo Dennis' (che implica la capacità di affrontare 16 bit). I programmatori devono pensare in binario quando si lavora con l'hardware (per cui ogni bit rappresenta tipicamente un cavo fisico) e quando si lavora con logica a bit (per cui ogni bit ha un significato definito dal programmatore).

Immagino Dennis ha aggiunto il prefisso 0 come il più semplice variazione possibile in numeri decimali di tutti i giorni, e più facile per quei primi parser da distinguere.

Credo Hex 0x__ è stato aggiunto al C po 'più tardi. L'albero di parsing compilatore di distinguere 1-9 (prima cifra di una costante decimale), 0 (primo [insignificanti] cifra di un costante ottale), e 0x (indicando un esagono costante da seguire in cifre successive) tra loro è notevolmente più complicato che usare uno 0 come indicatore di passare da analisi cifre successive come ottale anziché decimale.

Perché Dennis progettare in questo modo? programmatori contemporanei non apprezzare il fatto che quei primi computer erano spesso controllate commutando le istruzioni per la CPU lanciando fisicamente interruttori sul pannello frontale CPU, o con una scheda perforata o nastro di carta; tutti gli ambienti in cui il risparmio a pochi passi o istruzioni rappresentati risparmi di notevole lavoro manuale. Inoltre, la memoria è stato limitato e costoso, in modo da risparmiare ancora alcune istruzioni aveva un valore elevato.

In sintesi: 0 per ottale perché era efficiente parseable e ottale era user-friendly sul PDP-8 (almeno per la manipolazione indirizzo)

0x per hex probabilmente perché era una naturale estensione e compatibile con le versioni precedenti sullo standard prefisso ottale e ancora relativamente efficiente per analizzare.

Altri suggerimenti

Il prefisso zero per ottale, e 0x per esadecimale, sono fin dai primi giorni di Unix.

La ragione per le date di esistenza del ottale a quando c'era l'hardware con i byte 6 bit, che ha reso ottale la scelta naturale. Ogni cifra ottale rappresenta 3 bit, quindi un byte 6 bit è due cifre ottali. Lo stesso vale per esagono, dal byte di 8 bit, dove una cifra esadecimale è di 4 bit e quindi un byte è due cifre esadecimali. Utilizzando ottale per byte di 8 bit richiede 3 cifre ottali, di cui il primo può avere solo i valori 0, 1, 2 e 3 (la prima cifra è veramente 'TETRAL', non ottale). Non v'è alcun motivo per andare base32 meno che qualcuno sviluppa un sistema in cui i byte sono lunghi dieci bit, quindi un byte dieci bit potrebbe essere rappresentata come due "nybbles" 5 bit.

“Nuovo” numeri dovevano iniziare con una cifra, per lavorare con la sintassi esistente.

prassi consolidata aveva i nomi delle variabili e altri identificatori che iniziano con una lettera (o pochi altri simboli, forse di sottolineatura o il simbolo del dollaro). Quindi, “a”, “abc”, e “A04” sono tutti nomi. I numeri hanno iniziato con una cifra. Quindi, “3” e “3e5” sono numeri.

Quando si aggiungono nuove cose da un linguaggio di programmazione, cercate di farli stare nelle esistenti sintassi, la grammatica, e la semantica, e si tenta di rendere il codice esistente continuare a lavorare. Quindi, non si vuole cambiare la sintassi di fare “x34” un numero esadecimale o un numero ottale “O34”.

Quindi, come si adatta numeri ottale in questa sintassi? Qualcuno si rese conto che, ad eccezione di “0”, non v'è alcuna necessità di numeri che iniziano con “0”. Nessuno ha bisogno di scrivere “0123” per 123. Così si usa uno zero per indicare numeri ottali.

Che dire di numeri esadecimali? Si potrebbe usare un suffisso, in modo che “34x” significa 34 16 . Tuttavia, il parser deve leggere fino alla fine del numero di riferimento prima che sappia interpretare le cifre (se non incontrerà una delle “a” a cifre “F”, che naturalmente indicare un esadecimale). E 'più “facile” il parser per sapere che la cifra è esadecimale presto. Ma si devono ancora iniziare con una cifra, e il trucco a zero è già stato utilizzato, quindi abbiamo bisogno di qualcos'altro. “X” è stato scelto, e ora abbiamo “0x” per esadecimale.

(È possibile che si basa sulla mia comprensione di analisi e un po 'di storia di carattere generale su sviluppo del linguaggio, non sulla conoscenza delle decisioni specifiche fatte dagli sviluppatori del compilatore o comitati lingua.)

Non lo so ...

0 è per 0ctal

0x è per, beh, abbiamo già usato da 0 a significare ottale e c'è una x in esadecimale in modo tappo che anche lì

Per quanto riguarda la progressione naturale, miglior look per i più recenti linguaggi di programmazione che può apporre indici come

123_27 (interpretare _ significare pedice)

e così via

Mark

  

C'è una progressione naturale per base-32?

Questo è parte del motivo per cui Ada usa la forma 16 # per introdurre le costanti esadecimali, 8 ° posto per ottale, 2 ° posto per i binari, ecc.

Non vorrei occuparmi troppo oltre che necessitano di spazio per "la crescita futura" in basando però. Questo non è come RAM o spazio di indirizzamento in cui è necessario un ordine di grandezza più ogni generazione.

In realtà, gli studi hanno dimostrato che ottale ed esadecimale sono praticamente la sweet spot per le rappresentazioni human-readable che sono compatibili a livello binario. Se si va più in basso di ottale, comincia a richiedere un numero ridicolo di cifre per rappresentare i numeri più grandi. Se si va più in alto di quanto esadecimale, le tabelle matematiche diventano rediculously grande. Hex è in realtà un po 'troppo già, ma ottale ha il problema che non si adatta in modo uniforme in un byte.

C'è una codifica standard per Base32 . E 'molto simile a Base64 . Ma non è molto comodo da leggere. Esagonale viene utilizzata perché 2 cifre esadecimali possono essere utilizzate per rappresentare 1 8-bit byte. E ottale è stata utilizzata principalmente per i vecchi sistemi che utilizzavano 12-bit byte. È stata una rappresentazione più compatta dei dati rispetto alla visualizzazione dei registri prime come binario.

Si deve anche notare che alcune lingue usano o ### per ottale ed x ## o ## h per esagono, così come molte altre varianti.

Credo che 0x in realtà è venuto per il mondo UNIX / Linux ed è stato prelevato da C / C ++ e altri linguaggi. Ma io non conosco il motivo esatto o vera origine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top