Perché sono ancora in uso sia il piccolo che il big-endian oggi, dopo circa 40 anni di computer science binario? Ci sono algoritmi o formati di archiviazione che funzionano meglio con uno e molto peggio con l'altro? Non sarebbe meglio se tutti passassimo a uno e lo seguissimo?Perché sono in uso sia il piccolo che il big-endian?
risposta
Quando si aggiungono due numeri (su carta o in una macchina), si inizia con le cifre meno significative e si lavora verso le cifre più significative. (Lo stesso vale per molte altre operazioni).
Su Intel 8088, che aveva registri a 16 bit ma un bus dati a 8 bit, essendo little-endian permetteva a tali istruzioni di avviare l'operazione dopo il primo ciclo di memoria. (Ovviamente dovrebbe essere possibile che i recuperi di memoria di una parola avvengano in ordine decrescente anziché aumentare, ma sospetto che ciò avrebbe complicato un po 'il progetto.)
Nella maggior parte dei processori la larghezza del bus corrisponde alla larghezza del registro quindi questo non conferisce più un vantaggio.
I numeri big-endian, al contrario, possono essere confrontati a partire da MSB (sebbene molte istruzioni di confronto facciano effettivamente una sottrazione che deve comunque iniziare con l'LSB). Il bit del segno è anche molto facile da ottenere.
Esistono algoritmi o di stoccaggio formati che funzionano meglio con uno e molto peggio con l'altra?
No. Ci sono piccoli vantaggi qua e là ma niente di importante.
In realtà penso che litte-endian sia più naturale e coerente: il significato di un bit è 2^(bit_pos + 8 * byte_pos). Mentre con big endian il significato di un bit è 2^(bit_pos + 8 * (word_size - byte_pos - 1)).
Non sarebbe meglio se passassimo tutti a uno e continuassimo ad usarlo?
A causa del dominio di x86, abbiamo sicuramente gravitato verso little-endian. I chip ARM in molti dispositivi mobili hanno un carattere configurabile, ma sono spesso impostati su LE per essere più compatibili con il mondo x86. Che va bene per me.
Non dimenticare la rete che funziona per lo più in BE – mathk
Whoa, non ho mai saputo che i bit di ogni byte sono anche memorizzati meno significativi. Quindi 10 = 0x0A è davvero memorizzato come '01010000' e non binario 00001010? Questo è vero anche nei sistemi BE? – krubo
@krubo La più piccola unità indirizzabile è il byte, quindi in realtà è completamente arbitrario come si considerano i bit da disporre. Il modo in cui i bit sono "memorizzati" all'interno di un byte dipende interamente dalla convenzione che si desidera seguire. Se porti la tua convenzione di scelta su carta, scriveresti il valore 10 come 01010000 in Little Endian e come 00001010 in Big Endian. –
Sia big che little endian hanno i loro vantaggi e svantaggi. Anche se uno fosse chiaramente superiore (il che non è il caso), non c'è modo che nessuna architettura legacy sia mai in grado di cambiare l'endianità, quindi temo che tu debba imparare a conviverci.
Little Endian semplifica le tipografie. Ad esempio, se si dispone di un numero a 16 bit, è sufficiente trattare lo stesso indirizzo di memoria di un puntatore a un numero a 8 bit, poiché contiene gli 8 bit più bassi. Quindi non è necessario conoscere il tipo esatto di dati con cui si ha a che fare (anche se nella maggior parte dei casi lo si conosce comunque).
Big Endian è un po 'più leggibile. I bit vengono archiviati in memoria come appaiono in ordine logico (i valori più significativi per primi), proprio come per qualsiasi sistema numerico utilizzato dall'uomo.
In molti stati di astrazione molti argomenti non contano più. Penso che il motivo principale per cui abbiamo ancora entrambi sia che nessuno vuole passare. Non c'è una ragione ovvia per entrambi i sistemi, quindi perché cambiare qualcosa se il tuo vecchio sistema funziona perfettamente?
In realtà non seguo il tuo commento di tipografie. – Artelius
Su un sistema little-endian i bit meno significativi vengono prima in memoria. Quindi, puoi trattare questo puntatore di memoria come un valore a 8 bit (otterrai gli 8 bit meno significativi), il valore a 16 bit, ecc. Otterrai sempre il numero corretto di bit nell'ordine previsto. Sui sistemi big endian otterresti i bit più significativi, il che non è quello che ti aspetti dalla tipizzazione di un tipo di dati più grande a uno più piccolo. –
Generalmente il typecasting viene eseguito nei registri, altrimenti non è possibile firmare l'estensione e così via, ad eccezione di un cast reinterpretato, nel qual caso hai ragione, tuttavia su alcune macchine big endian, un puntatore punta al ultimo byte di una parola, non la prima, che promuove solo tutta la confusione. – Artelius
- 1. Perché il DOM ha sia la finestra che il sé?
- 2. Perché sia il conteggio SELECT (PK) che il conteggio SELECT (*) sono così lenti?
- 3. Perché Object include sia il kernel che ereditarlo in Ruby?
- 4. Perché il dizionario .Net sembra che sia ordinato?
- 5. Perché Git pensa che il mio file cs sia binario?
- 6. Perché Scheme ha sia la lista che il preventivo?
- 7. Perché sia SqlConnection sia SqlTransaction sono presenti nel costruttore SqlCommand?
- 8. Perché il JDK ha sia Math.random() sia la classe Random?
- 9. Visualizza sia il codice assembly che C
- 10. Perché il mio piccolo STRef Int richiede l'allocazione di gigabyte?
- 11. Il pacchetto R funziona sia in Windows che in Linux
- 12. Come funziona il piccolo URL
- 13. Perché pensare che l'obiettivo sia aggiornato?
- 14. perché __builtins__ è sia modulo che dict
- 15. perché utilizzare sia os.path.abspath che os.path.realpath
- 16. Perché TortoiseHg pensa che Resource.h sia binario?
- 17. attendere che il wifi sia connesso su Android
- 18. Fortran: il più grande e il più piccolo intero
- 19. Perché l'ampliamento batte sia il box che i var-arg in Sovraccarico di un metodo?
- 20. assicurandosi che il programma sia in un terminale
- 21. Impossibile rilasciare il database perché è attualmente in uso MVC
- 22. Perché la caratteristica del prestito richiede che il tipo preso in prestito sia un riferimento?
- 23. Come garantire che il metodo toString() sia reimplementato in classe?
- 24. Verificare che il record sia stato inserito correttamente in Symfony2
- 25. In WatiN come aspettare che il postback sia completo
- 26. In che modo Lisp può essere sia dinamico sia compilato?
- 27. Spring Security utilizzando sia il nome utente che l'e-mail
- 28. In F #, perché esiste sia List.empty che List.Empty
- 29. Perché sembra che il mio generatore di numeri casuali non sia casuale in C#?
- 30. Perché `e` è usato sia per il binario AND che per l'indirizzo di in C?
Hai appena rubato le parole dalla mia bocca. :). Grazie – Soundararajan
Se non avessimo ottenuto i nostri numeri da una lingua semitica, saremmo anche noi little-endian. – hoodaticus