Dove sono utili gli ottali? [chiuso]


36

Ho appena sbattuto la testa contro il tavolo per circa 20 minuti guardando un bug totalmente strano in PHP, e poi ho capito che c'era ottale. L'ottale <% (* & #>.

In breve, ho riempito alcuni letterali di zeri in modo che il codice fosse allineato, lo so, grande errore. Dimenticato gli ottali.

La domanda è: qualcuno usa gli ottali per qualcosa di diverso dalle autorizzazioni per i file? (Personalmente preferisco, chmod ugo+rwxma capisco che se devono essere generati a livello di programmazione, è utile usare ottali.) Ma sono utili in qualsiasi altra situazione?


16
Opzione A: incolpare te stesso. Opzione B: incolpare il mondo. Opzione C: ridacchia mentre hai imparato qualcosa.
Giobbe

12
@Petrozza - IMO l'uso in stile C di uno zero iniziale per indicare l'ottale non è mai stata una buona scelta, ma è storia - probabilmente un po 'di eredità in C, anche se potrebbe essere ancora più antica. Penso che Ada abbia una delle convenzioni migliori - un numero ottale sarebbe scritto 8 # 1234567 #, un numero esadecimale 16 # abcdef #, ecc. E gli zeri iniziali sono solo zeri iniziali - qualsiasi base da 2 a 16 (almeno) è valida e tutti sono visivamente ovvi e facili da capire.
Steve314

2
@Petruza La tua domanda nella sua forma originale non era costruttiva per questo sito, ed è stata migliorata dalla community in modo che potesse rimanere aperta: consulta le FAQ per ulteriori informazioni sul perché le persone lo fanno e perché lo incoraggiamo. Se hai ulteriori domande o dubbi, ti preghiamo di sollevarli sul nostro sito di meta-discussione , non nella tua domanda.

11
Opzione D: "biasimare PHP" è sempre la scelta giusta, indipendentemente dal problema
Cefalopode

2
@ Steve314 Sono totalmente d'accordo. Un altro esempio degno di nota è Python in cui hanno il 0oprefisso (che è coerente con 0xe 0bma forse un po 'difficile da distinguere 00). E da Python 3, gli zeri iniziali in più sono un errore di sintassi per prevenire questo tipo di bug.
5gon12eder,

Risposte:


42

Secondo Wikipedia , gli ottali non sono così comuni come una volta. Come altri hanno già detto, in passato i sistemi avevano una parola a 12/24/36 bit, che è più facilmente rappresentata in ottale rispetto a esadecimale, ma attualmente le architetture x86 e i64 usano un bit 16/32/64 parola, che è più facilmente rappresentata in esadecimale e decisamente brutta in ottale.

Gli usi attuali, tuttavia, includono:

Si noti che i moderni linguaggi di programmazione a volte non supportano più gli ottali a causa della mancanza di casi d'uso e del potenziale di bug. C # è un esempio, come ha scritto Eric Lippert nella 3a e 4a edizione della TCPL :

C # non supporta i letterali ottali, per due motivi. In primo luogo, quasi nessuno usa letterali ottali in questi giorni. In secondo luogo, se C # supportasse l'ottale nel formato standard "zero iniziale significa ottale", sarebbe una potenziale fonte di errori. Considera questo codice:

    FlightNumber = 0541;

Chiaramente questa espressione è intesa come letterale decimale e non letterale ottale.

Correlato, e solo per riferimento e curiosità, Codice, The Hidden Language of Computer Hardware ha un'eccellente spiegazione facile da seguire su ottali e altri sistemi numerici a pagina 55 - 63 .


1
In quella nota, fai attenzione a Javascript quando gestisci l'input dell'utente. parseInt(011)==9
Darien,

3
Questo è davvero interessante per Yuki e Pamean. Mi è appena venuto in mente che il conteggio esadecimale del dito è ragionevolmente facile, se usi l'interno di ogni dito, usando alcune variazioni, come questa
ocodo

@Slomojo - puoi contare fino a 99 sulle dita , in effetti ...
detly

3
+1 per una risposta molto completa. Grace Hopper una volta disse che aveva problemi a bilanciare il suo libretto degli assegni, perché era diventata così brava ad aggiungere nell'ottale.
Macneil,

14
@detly, se so che ho bisogno di contare numeri grandi userò le mie 10 cifre come bit e contare fino a 1024 con solo le mie dita (fai solo attenzione a chi mostri # 4, # 128 e # 132).
zzzzBov,

17

Octal è stato ampiamente utilizzato circa 50 anni fa da Digital Equipment Corp. (DEC) e altre società che disponevano di computer con una parola a 12 bit (ad esempio il PDP-8) o altri multipli di sei, come 18 e 36 (ad esempio UNIVAC 1108 ). Ho usato sia il PDP-8 che l'UNIVAC 1108 a scuola di specializzazione. I caratteri in entrambe le macchine usavano tipicamente sei bit, non 8.

Formato istruzioni PDP-8

Formato dell'istruzione PDP-8 - notare che i bit sono numerati 0 -> 11. Il bit 0 era l'MSB (bit più significativo).

Quando DEC uscì con il PDP-11 a 16 bit, continuarono a usare ottale nella loro documentazione anziché esadecimale come usato dagli altri produttori di minicomputer che uscivano con macchine a 16 bit all'epoca. Ciò era probabilmente dovuto ai molteplici campi a 3 bit all'interno dei formati di istruzione PDP-11 come Register, Mode e Src / Dest che si prestavano a essere decodificati come una cifra ottale. (Grazie a John Strohm per averlo sottolineato.)

È interessante notare che quando Motorola è uscito con il suo microprocessore 68000, che è stato fortemente influenzato dal PDP-11 e aveva gli stessi campi Modalità e Registro a 3 bit nelle istruzioni, hanno scelto di utilizzare solo esadecimali nella loro documentazione.

Poiché il PDP-11 utilizzava la notazione ottale, i codici di autorizzazione originali per Unix, che apparvero per la prima volta sul PDP-11, utilizzavano anche l'ottale. Questa eredità persiste in Linux, dove il comando chmod usa ancora ottale per specificare ciascuno dei campi 'rwx' a tre bit.

Altre curiosità - CompuServe, che era un servizio dial-up online ampiamente utilizzato negli anni '80 e nei primi anni '90 (prima di essere offuscato da AOL), funzionava su minicomputer DEC, almeno in origine. Tutti gli ID utente erano numerici e ad un certo punto ho fatto l'osservazione che non includevano mai 8 o 9 in essi, quindi erano in ottale. Il mio vecchio ID CIS era 70205.


1
Il tuo commento sulla documentazione di PDP-11 non è corretto. Il PDP-11 aveva 8 registri. R0-R5 erano registri di uso generale. R6 era il puntatore dello stack e R7 era il PC. L'istruzione MOV ha preso due numeri di registro a 3 bit e due modalità di indirizzamento a 3 bit. Octal acquisisce PERFETTAMENTE i campi del registro e della modalità. (Dubito fortemente che sia stato un incidente.) L'uso di hex avrebbe confuso tutto. PUSH e POP stavano solo affrontando le modalità che utilizzavano R6. L'operando immediato era una modalità di indirizzamento che utilizzava R7.
John R. Strohm,

@ JohnR.Strohm Grazie per il commento sui registri a 3 bit. Sono d'accordo con la tua analisi e ho aggiornato la mia risposta.
Tcrosley,

Quindi DEC ha lavorato in PTOM. Avrei dovuto usare solo multipli di 3,32 bit per evitare confusione.
user234461

È divertente come non abbia mai considerato le autorizzazioni Unix come un numero ottale, l'ho sempre pensato come tre cifre singole scritte insieme, ognuna delle quali rappresentava i tre bit rwx, quindi potevano essere ottali, decimali o addirittura esadecimali.
axl

11

Heathkit li usava per il pannello frontale del loro H-8 e per gli elenchi in lingua assembly del loro software del pannello frontale (chiamato PAM-8). Incontri me stesso, lo so.

inserisci qui la descrizione dell'immagine

Oggi gli ottali sono molto rari; tutti sembrano usare hex. Ma i numeri sembrano ancora numeri in ottale e non è necessaria una riga aggiuntiva di chiavi per le cifre da A a F.


2
+1 per l'H-8. Nonostante fosse ottale all'esterno, la CPU era un 8080A, che era tutto byte. Vai figger.
Blrfl

Immagino che usassero l'ottale per la comunanza con l'H-11 (che aveva una CPU PDP-11).
Jerry Coffin,

2
L'8080 aveva byte a 8 bit, ma il set di istruzioni aveva più senso se osservato in ottale che in esadecimale.
RBerteig,

6

Uno dei motivi per cui ottale vede l'uso è perché è la base più grande che è una potenza di 2 per la quale non hai bisogno di caratteri speciali - cioè, tutte le cifre possono essere numeriche. La base 16 (la successiva dalla base 8) richiede cifre non numeriche (di solito A, B, C, D, E, F).


So che questo è vecchio, ma perché usare solo cifre numeriche sarebbe preferibile usare anche le lettere?
Petruza,

5

Uso ottale ogni giorno. Ogni volta che ho bisogno di chmod un file uso ottale (pre-data la notazione u + r ...). Ogni volta che voglio incorporare un carattere di controllo all'interno di una stringa uso ottale ... (Sì, potrei usare hex, ma ottale è quello che uso).


2
+1 per "ma ottale è ciò che uso" :)
JoelFan

5

Chiunque abbia bisogno di esprimere combinazioni di bit raggruppati in tre.

Perché qualcuno usa hex?


Cose dalla parte superiore della mia testa che sono espresse come numeri ottali:

  • Codici compressi dai transponder Mode 3A negli aeroplani
  • Determinati valori trovati sul bus avionico ARINC 429
  • Indirizzi SCSI
  • Codici chiave nella ncurseslibreria

11
La differenza è che hex è "naturale" come mezzo byte. Due cifre esadecimali = 1 byte. Ma non puoi dividere i byte in cifre ottali.
Mason Wheeler,

2
La prima riga afferma l'ovvio. Il secondo fa una scarsa analogia.
back2dos

3
E hex è completamente innaturale per tutto ciò che deve essere espresso in gruppi di tre bit come le modalità di file Unix sopra menzionate. Non esiste una legge che dice che le cifre di un particolare sistema di numerazione devono allinearsi ai byte. Se ci fosse, esprimere qualcosa a un computer come base 10 sarebbe una pratica peggiore della base 8, che almeno si allinea con gruppi di bit.
Blrfl

6
una tipica stringa esadecimale è ovviamente una stringa esadecimale. ottale no.
Paul Nathan,

1
@Blrfl: Quindi quante di queste citate "[cose che] devono essere espresse in gruppi di tre bit" sono separate dall'esempio canonico? Questa è la vera domanda, che finora hai lasciato senza risposta. Invece fai ancora un'altra povera analogia. C'è un reale utilizzo per la rappresentazione decimale, perché abbiamo semplicemente imparato a gestirla. Quale sarà si calcola più velocemente? 7 * 6o 07 * 06? Usiamo i decimali per rappresentare i numeri poiché possiamo gestirli meglio ed esadecimali per rappresentare i numeri molto vicini a come li memorizza la macchina. E lo facciamo molto. Questo sito è pieno di prove.
back2dos,

5

All'epoca in cui lavoravo ai mainframe CDC (con una parola a 60 bit, una parola a 12 bit per la PPU), tutti i core dump e simili venivano eseguiti in ottali (20 cifre ottali per parola, 4 per parola PPU).


3

Come nell'esadecimale, la notazione ottale viene talvolta utilizzata per specificare i codici carattere. Può essere utile per lo stesso motivo dell'esadecimale: è più compatto del binario, ma molto facile da tradurre in binario nella tua testa.


2

Come Hex, i numeri ottali sono facili da convertire da binari. Basta raggruppare le cifre binarie in gruppi di tre, a partire da destra.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
Questo è ovvio. La domanda riguarda quando viene effettivamente utilizzato .
back2dos,

2
@ back2dos: quindi sentiti libero di pubblicare una risposta invece di lasciare lo stesso commento più volte.
Ed S.

4
@Ed S. Non hai nemmeno provato a rispondere alla domanda. Hai detto qualcosa di ovvio a cui il poster originale già quasi sicuramente conosceva la risposta. Come i moderatori adorano dire, questo non è ciò per cui stiamo girando. Vedi meta.programmers.stackexchange.com/questions/1968/… per ulteriori informazioni.
btilly

@ back2dos, btilly - Le risposte sui siti Stackexhange non sono solo per l'OP, ma diventano una risorsa persistente per qualsiasi lettore di passaggio. Tutti i fatti ovvi , non sono necessariamente ovvi per tutti, se questa risposta aiuta il penny-drop per qualcuno che ha valore.
ocodo,

2
@Slomojo anche se da quell'argomento, ogni domanda è idonea a diventare un wiki per ogni aspetto correlato di un argomento. Il punto è che questo non risponde alla domanda . Questa risposta può certamente essere valida altrove, a "Come convertire rapidamente mentalmente in ottale?"
Nicole,

2

No. Non li ho mai usati. Nemmeno per l'impostazione delle autorizzazioni per i file, perché lo faccio così raramente mi risulta difficile da leggere.

Quindi sì, c'è l'ovvio vantaggio della conversione da e in binario.
Tuttavia, come già sottolineato da @ Mason, hex è molto più "naturale", perché 2 cifre esadecimali formano un byte. È utile per rappresentare colori RGB / ARGB a 24/32 bit, indirizzi IP, maschere di byte, ecc. L'ottale sull'altro lato non è molto pratico, perché raramente si hanno scenari in cui si lavora in termini di gruppi a 3 bit.

Le autorizzazioni per i file sono in realtà l'unica cosa a cui potrei pensare. E se non ci sono aree di utilizzo al momento, dubito che ce ne sarà mai una. Dagli ultimi 20 anni lo spazio è diventato così economico, che è diventato molto raro confezionare le informazioni così strettamente, a costo di allineamento, facilità d'uso ed estensibilità.


2

Un po 'a parte, ma un uso pubblico è sulla metropolitana di Londra. Ogni treno ha sia un'identità fisica, sia un'identità separata negli orari che viene visualizzata durante il servizio - vedi qui: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (notare il 402 nella parte superiore del display di destinazione). Sebbene l'elettronica per i display sia basata su standard decimali standard, non si vedono mai le cifre 8 o 9 perché sono legate all'hardware basato su ottali legacy nel sistema di segnalazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.