Un byte contiene 8 bit o 9?


56

Ho letto in questo tutorial di programmazione dell'assemblaggio che 8 bit sono utilizzati per i dati mentre 1 bit è per la parità, che viene quindi utilizzato per rilevare errori di parità (causati da guasti hardware o disturbi elettrici).

È vero?


5
Vedi cs.stackexchange.com/a/19851/584 per una discussione su cosa può essere un byte .
AProgrammer

63
Quell'articolo è pieno di sciocchezze e dovresti ignorarlo.
David Schwartz,

12
Se vuoi essere pedante, chiamali semplicemente "ottetti". Quell'articolo o è scritto con un processore molto specifico in mente (uno che deve tenere i bit di parità nella ROM per qualche motivo ...) o è semplicemente stravagante. I PIC di microchip, ad esempio, usano una lunghezza di parola di 14 bit. L'intera memoria del programma è organizzata in un array N x 14 bit.
Nick T

13
@NickT: non sono la stessa cosa, però. Un ottetto ha sempre 8 bit, un byte può essere qualsiasi cosa.
Jörg W Mittag,

4
L'articolo potrebbe aver fatto riferimento ai meccanismi di correzione della memoria utilizzati in alcuni primi PC IBM, ma affermando che "byte è un dato di 8 bit + parità di 1 bit" è assolutamente privo di senso. Ad esempio, i CD-ROM di solito utilizzano meccanismi di correzione degli errori molto più avidi: un tipico CD audio utilizzerà 8 byte per 24 byte di dati audio. Ma la parte più importante è che non ti importa . Affatto. È esclusivo dell'attuale meccanismo di archiviazione della memoria: alla CPU non importa, al tuo codice non importa.
Luaan,

Risposte:


78

Un byte di dati è di otto bit, potrebbero esserci più bit per byte di dati che vengono utilizzati nel sistema operativo o persino a livello hardware per il controllo degli errori (bit di parità o anche uno schema di rilevamento degli errori più avanzato), ma i dati sono otto bit e qualsiasi bit di parità è generalmente invisibile al software. Un byte è stato standardizzato per indicare "otto bit di dati". Il testo non è sbagliato nel dire che potrebbero esserci più bit dedicati alla memorizzazione di un byte di dati rispetto agli otto bit di dati, ma quelli non sono in genere considerati parte del byte in sé, il testo stesso indica questo fatto.

Puoi vederlo nella seguente sezione del tutorial:

Doubleword: a 4-byte (32 bit) data item

4 * 8 = 32, potrebbe effettivamente richiedere 36 bit sul sistema, ma per i tuoi scopi e scopi è solo 32 bit.


5
Bene, se l'hardware implementa il rilevamento degli errori, probabilmente lo farebbe con blocchi di memoria più grandi di un byte, come con settori a 512 byte o così ... in questo modo è possibile ridurre il sovraccarico di memoria aggiuntiva necessaria. Giusto per chiarire: anche con la correzione degli errori l'hardware utilizza ancora 8 bit per byte più alcuni bit per ogni "blocco" di dati, che è probabilmente molto più grande di un singolo byte.
Bakuriu,

11
Si noti che esistono sistemi con byte non a 8 bit visibili dal software. Vedi Quali piattaforme hanno qualcosa di diverso dal char a 8 bit? domanda a StackOverflow.
Ruslan,

3
Sì, esistono davvero. Sebbene quel particolare link stia parlando di caratteri non a 8 bit. Per così dire: byte usato semplicemente per riferirsi al numero di bit che un determinato sistema impiegava per memorizzare un 'char', che era basso quanto sei bit. Ma IIRC è standardizzato nella specifica IEC-80000 che un byte è 8 bit. Mentre ti allontani dai sistemi tradizionali, trovi ovviamente delle stranezze e gli standard non sono leggi.
JustAnotherSoul

3
@JustAnotherSoul: E ci sono standard concorrenti, che definiscono byte come "almeno 8 bit" o in altri modi. È interessante vedere come decenni dopo la definizione di byte cambia nelle menti delle persone. Nel tempo di byte di eterogeneità architettonica molto più era semplicemente la più piccola unità indirizzabile della tua architettura (guarda vari PDP per esempi). Questo è anche il motivo per cui nell'avvento di Internet il termine ottetto è stato usato per descrivere i dati su filo, poiché byte non era una parola universale per un blocco di dati a 8 bit.
PlasmaHH il

2
@JustAnotherSoul nota che charin C (che è il collegamento) è esattamente la più piccola unità di memoria indirizzabile. Si chiama semplicemente char , ma lo standard C lo rende anche byte .
Ruslan,

48

Tradizionalmente, un byte può avere qualsiasi dimensione ed è solo la più piccola unità di memoria indirizzabile. In questi giorni, i byte a 8 bit sono stati praticamente standardizzati per il software. Come ha detto JustAnotherSoul, l'hardware potrebbe memorizzare più bit degli 8 bit di dati.

Se stai lavorando su dispositivi logici programmabili, come FPGA, potresti vedere che la loro memoria interna è spesso indirizzabile come blocchi a 9 bit e come autore HDL, potresti usare quel 9 ° bit per il controllo degli errori o solo per archiviare quantità maggiori di dati per "byte". Quando si acquistano chip di memoria per hardware personalizzato, in genere è possibile scegliere tra unità indirizzabili a 8 o 9 bit (o 16/18, 32/36, ecc.), E quindi dipende da te se si dispone di "byte" a 9 bit e quali lo fai con quel nono bit se scegli di averlo.


10
Generalmente quando c'è un gruppo di dati che è logicamente una singola unità ma contiene più / meno di 8 bit, si chiama "parola". Ad esempio, alcuni processori utilizzano una parola di istruzione a 40 bit.
Devsman,

3
+1. Per inciso, ci sono state architetture con "puntatori di bit" e "puntatori di byte". In tali architetture, tecnicamente un byte non è "la più piccola unità di memoria indirizzabile" (poiché è possibile indirizzare ogni bit in modo indipendente), sebbene sia difficile dire di cosa si tratta in modo succinto . Immagino sia una specie di "lo so quando lo vedo". :-P
ruakh

18
"Ottetto" era la parola tradizionalmente usata per significare "lo definirei un byte, ma in realtà intendo esattamente 8 bit" per vari protocolli di comunicazione tra sistemi che possono avere dimensioni di byte diverse. Ma in questi giorni, usare byte per significare tutt'altro che 8 bit è anacronistico.
wnoise il

@Devsman Non necessariamente. I chip x86 hanno parole a 32 bit e byte a 8 bit, ad esempio. Un byte è la dimensione indirizzabile più piccola. La parola è un po 'più vagamente definita, ma tende ad essere la dimensione più comoda con cui lavorare; cioè la lunghezza prevista dell'operando della maggior parte delle istruzioni.
Ray,

Questa dovrebbe essere contrassegnata come la risposta corretta, è più corretta.
awiebe,

32

Quel testo ha una formulazione estremamente scadente. Sta quasi certamente parlando della RAM ECC (codice di correzione degli errori) .

La RAM ECC memorizza comunemente informazioni a 8 bit utilizzando 9 bit. Il bit per byte extra viene utilizzato per memorizzare i codici di correzione degli errori.

ECC vs non ECC (In entrambi i casi, ogni byte è distribuito su ogni chip. Immagine gentilmente concessa da Puget Systems )

Tutto ciò è completamente invisibile agli utenti dell'hardware. In entrambi i casi, il software che utilizza questa RAM rileva 8 bit per byte.


A parte questo: i codici di correzione degli errori nella RAM in genere non sono in realtà 1 bit per byte; sono invece 8 bit per 8 byte. Questo ha lo stesso spazio in testa, ma presenta alcuni vantaggi aggiuntivi. Vedi SECDED per maggiori informazioni.


12
La parità RAM e ECC RAM sono cose diverse. La RAM di parità memorizza un bit aggiuntivo per dominio di errore, è in grado di rilevare tutti gli errori a singolo bit e nessun errore a doppio bit e non può risolvere nulla. ECC memorizza un numero di bit aggiuntivi per dominio di errore, può rilevare e correggere tutti gli errori a bit singolo, può rilevare ma non correggere tutti gli errori a doppio bit e rilevare errori più grandi. La RAM di parità è rara in questi giorni, essendo stata quasi interamente sostituita dalla RAM ECC.
Segna il

1
@Mark: ho accennato a ciò nel mio ultimo paragrafo, ci sono più dettagli nel link. Oggigiorno la RAM di parità è praticamente inesistente perché un codice di correzione errori (72,64) ha lo stesso overhead di un codice di parità (9,8).
BlueRaja - Danny Pflughoeft il

7
Mentre lo accenni, dichiari anche cose che lo rendono impreciso / confuso. La RAM ECC non "memorizza informazioni di valore a 8 bit utilizzando 9 bit". Affermare ciò implica che puoi fare ECC per 8 bit usando 9 bit, il che non è possibile. Per 8 bit di informazioni discrete è sufficiente 1 bit in più per rilevare , non corretti, errori a bit singolo. Gli ECC utilizzano un numero maggiore di bit o byte per contenere dati sufficienti a correggere errori per gruppi di dati, generalmente più grandi di un singolo byte. Anche se questo potrebbe avere una media di un bit in più per 8 bit, non può essere scomposto associando solo 1 bit per ogni 8 bit.
Makyen,

Esiste uno schema a 36 bit (32 bit word + 4 bit ECC) che consente la correzione degli errori a bit singolo e il rilevamento degli errori a due bit. Sebbene sia possibile dividerlo aritmeticamente in 8 bit di dati + 1 bit ECC, non può / non funziona in questo modo. Sono richiesti i 4 bit completi di ECC, che copre 32 bit di dati.
Zenilogix,

@Zenilogix e altri che hanno ripetuto la stessa cosa: capisco molto bene come funziona ECC e nulla di ciò che ho detto non era corretto. Non ho mai affermato che l'ECC a 8 bit può essere fatto con 9 bit, ho detto che la RAM ECC utilizza 9 bit per byte di memoria. Il modo in cui funziona ECC è completamente fuori portata per questa domanda, motivo per cui ho lasciato i dettagli a parte con un link. Si prega di interrompere tutti i commenti pedanti.
BlueRaja - Danny Pflughoeft il

16

In generale, la risposta breve è che un byte è 8 bit. Ciò semplifica eccessivamente la questione (a volte anche fino al punto di inesattezza), ma è la definizione a cui la maggior parte delle persone (incluso un gran numero di programmatori) ha familiarità, e la definizione che quasi tutti usano per impostazione predefinita (indipendentemente da quanti byte di dimensioni diverse essi ' ho dovuto lavorare con).

Più specificamente, un byte è la più piccola unità di memoria indirizzabile per l'architettura data ed è generalmente abbastanza grande da contenere un singolo carattere di testo. Sulla maggior parte delle architetture moderne, un byte è definito come 8 bit; ISO / IEC 80000-13 specifica anche che un byte è 8 bit, così come il consenso popolare (il che significa che se stai parlando, diciamo, di byte a 9 bit, incontrerai molti problemi a meno che tu non esplicitamente indica che non intendi byte normali).

Tuttavia, ci sono eccezioni a questa regola. Per esempio:

Quindi, nella maggior parte dei casi, un byte sarà generalmente di 8 bit. In caso contrario, è probabilmente 9 bit e può o meno essere parte di una parola di 36 bit.


8

Si noti che il termine byte non è ben definito senza contesto. Per quanto riguarda le architetture informatiche, si può presumere che un byte sia a 8 bit, almeno per le architetture moderne. Ciò è stato in gran parte standardizzato dai linguaggi di programmazione come C, che richiedeva che i byte avessero almeno 8 bit ma non forniva alcuna garanzia per byte più grandi, rendendo 8 bit per byte l'unica ipotesi sicura.

Esistono computer con unità indirizzabili di dimensioni superiori a 8 bit (in genere 16 o 32), ma tali unità vengono generalmente chiamate parole macchina, non byte. Ad esempio, un DSP con parole RAM da 32 KB a 32 bit verrebbe pubblicizzato con 128 KB o RAM, non 32 KB.

Le cose non sono così ben definite quando si tratta di standard di comunicazione. ASCII è ancora ampiamente utilizzato e ha byte a 7 bit (che si adattano perfettamente ai byte a 8 bit sui computer). I ricetrasmettitori UART sono ancora prodotti per avere una dimensione dei byte configurabile (di solito, puoi scegliere almeno tra 6, 7 e 8 bit per byte, ma 5 e 9 non sono inauditi).


6

Un byte viene generalmente definito come la più piccola unità di spazio di memoria indirizzabile individualmente. Può essere di qualsiasi dimensione. Ci sono state architetture con dimensioni di byte comprese tra 6 e 9 bit, forse anche più grandi. Ci sono anche architetture in cui l'unica unità indirizzabile è la dimensione del bus, su tali architetture possiamo o dire che semplicemente non hanno byte o che il byte ha le stesse dimensioni della parola (in un caso particolare che conosco sarebbe essere a 32 bit); in entrambi i casi, non è sicuramente a 8 bit. Allo stesso modo, ci sono architetture bit-indirizzabili, su quelle architetture, potremmo di nuovo sostenere che i byte semplicemente non esistono, o potremmo sostenere che i byte sono 1 bit; in entrambi i casi è una definizione ragionevole, ma 8 bit è decisamente sbagliato.

Su molte architetture di uso generale mainstream, un byte contiene 8 bit. Tuttavia, ciò non è garantito. Quanto più ti allontani dalle CPU mainstream e / o generiche, tanto più si incontrano byte non a 8 bit. Questo va così lontano che alcuni software altamente portatili rendono persino configurabili le dimensioni. Ad esempio, le versioni precedenti di GCC contenevano una macro chiamata BITS_PER_BYTE(o qualcosa del genere), che configurava la dimensione di un byte per una particolare architettura. Credo che alcune versioni precedenti di NetBSD possano essere eseguite su architetture non a 8 bit per byte.

Se vuoi davvero sottolineare che stai parlando di una quantità esatta di 8 bit piuttosto che della più piccola quantità di memoria indirizzabile, per quanto grande possa essere, puoi usare il termine ottetto , che è ad esempio usato in molti nuovi RfC.


2
Gli standard C e C ++ hanno una macro predefinita CHAR_BIT(trovata in limits.h), di cui non sono a conoscenzaBITS_PER_BYTE
njuffa

3

Quando ho iniziato a programmare nel 1960, avevamo parole a 48 bit con byte a 6 bit - allora non si chiamavano quel nome, ma erano chiamati caratteri. Quindi ho lavorato sul computer Golem con parole a 75 bit e byte a 15 bit. Successivamente, i byte a 6 bit erano la norma, fino a quando IBM non è uscito con il 360, e oggigiorno un byte è comunemente equivalente a un ottetto, cioè 8 bit di dati. Alcuni componenti hardware avevano bit aggiuntivi per il rilevamento degli errori e forse per la correzione degli errori, ma questi non erano accessibili dal software.


3

Un byte è 8 bit.

In un lontano passato c'erano diverse definizioni di una parola di memoria e di un byte. Il suggerimento che questa ambiguità sia diffusa o prevalente nella vita di oggi è falso.

Fin dalla fine degli anni '70, un byte è stato di 8 bit. La popolazione di massa di computer e PC domestici ha tutti usato in modo inequivocabile un byte come valore di 8 bit nella loro documentazione, così come tutte le schede tecniche e la documentazione per unità disco floppy, unità disco rigido e PROM / EPROM / EEPROM / Flash EPROM Chip di memoria / SRAM / SDRAM che ho letto in quel periodo di tempo. (E ne ho letti personalmente molti in tutto quel periodo di tempo.) Ethernet e un paio di altri protocolli di comunicazione mi spiccano come insoliti nel parlare di ottetti.

L'ambiguità del termine byte è di per sé una cosa rara e oscura. Pochissimi tra i programmatori, i progettisti, i progettisti, i venditori, i tecnici dell'assistenza o gli utenti medi degli ultimi 30 anni penserebbero che significasse qualcosa di diverso da un valore a 8 bit, se riconoscessero la parola .

Quando un byte viene gestito dall'hardware, ad esempio se archiviato in chip di memoria o comunicato lungo il filo, l'hardware può aggiungere dati ridondanti al byte. Ciò può in seguito aiutare a rilevare errori hardware in modo che i dati inaffidabili possano essere riconosciuti e scartati (ad es. Parità, checksum, CRC). Oppure può consentire la correzione di errori nei dati e il recupero dei dati (ad es. ECC). In entrambi i casi, i dati ridondanti verranno eliminati quando il byte è stato recuperato o ricevuto per un'ulteriore elaborazione. Il byte rimane il valore centrale a 8 bit e i dati ridondanti rimangono dati ridondanti.


2

Innanzitutto, il tutorial a cui fai riferimento sembra essere piuttosto obsoleto e sembra essere diretto a versioni obsolete di processori x86, senza dichiararlo, quindi molte delle cose che leggi lì non saranno comprese da altri (ad esempio se affermi che una WORD è di 2 byte, le persone o non sapranno di cosa stai parlando, o sapranno che ti è stato insegnato sulla base di processori x86 molto obsoleti e sapranno cosa aspettarti).

Un byte è il numero di bit che qualcuno decide che dovrebbe essere. Potrebbe essere 8 bit, o 9 bit o 16 bit, qualsiasi cosa. Nel 2016, nella maggior parte dei casi, un byte sarà di otto bit. Per sicurezza puoi usare il termine ottetto: un ottetto è sempre, sempre, otto bit.

La vera confusione qui sta confondendo due domande: 1. Qual è il numero di bit in un byte? 2. Se volessi trasferire un byte da un posto all'altro, o se volessi memorizzare un byte, usando mezzi fisici pratici, come lo farei? La seconda domanda di solito ti interessa poco, a meno che tu non lavori in un'azienda che produce modem, dischi rigidi o unità SSD. In pratica sei interessato alla prima domanda, e per la seconda dici semplicemente "beh, qualcuno si prende cura di quello".

Il bit di parità menzionato è un meccanismo primitivo che aiuta a rilevare che quando un byte viene archiviato in memoria e, successivamente, il byte viene letto, la memoria è cambiata per caso. Non è molto buono, perché non troverà che due bit sono stati cambiati, quindi è probabile che una modifica non venga rilevata, e non può recuperare dal problema perché non c'è modo di scoprire quale degli 8 bit è cambiato o anche se il bit di parità è cambiato.

I bit di parità non sono praticamente utilizzati in quella forma primitiva. I dati archiviati in modo permanente sono generalmente protetti in modi più complicati, ad esempio aggiungendo un checksum a 32 bit o più lungo a un blocco di 1024 byte, che occupa molto meno spazio extra (0,4% in questo esempio anziché 12,5%) ed è molto meno probabilità di non scoprire quando qualcosa non va.


Davvero obsoleto: il "paragrafo" a 16 byte non è stato un'unità di memoria significativa dal passaggio dalla modalità reale all'indirizzamento segmentato.
Segna il

Personalmente, assumerei "WinAPI" quando qualcuno parla di 2 byte WORD, il che ... in qualche modo dimostra il tuo punto, dal momento che molti nomi di tipo WinAPI sono obsoleti ma conservati per compatibilità con le versioni precedenti. xP
Justin Time 2 Ripristina Monica il

1

Nonostante le risposte davvero eccellenti fornite qui, sono sorpreso che nessuno abbia sottolineato che i bit di parità o i bit di correzione degli errori sono per definizione "metadati" e quindi non fanno parte del byte stesso.

Un byte ha 8 bit !


0

Nell'uso moderno, un byte è 8 bit, punto (sebbene abbia storicamente avuto altre definizioni). D'altra parte, una parola di dati è qualunque cosa l'hardware in questione gestisca come un'unità atomica - potrebbe essere 8 bit, 9 bit, 10 bit, 12 bit, 16 bit, 20 bit, 24 bit, 32 bit, ecc. Vari computer i sistemi nel corso degli anni hanno avuto ogni sorta di dimensioni delle parole diverse.

Per implementare un sistema di memoria o un protocollo di trasmissione, è utile aggiungere il rilevamento / correzione degli errori che comporta bit aggiuntivi. Non creano un byte a 9 bit perché, come detto sopra, un byte è 8 bit.

Vari schemi aggiungono il rilevamento e / o la correzione degli errori in vari modi.

L'uso tipico della parità è di aggiungere un bit in più alla parola di trasmissione in modo che il ricevitore possa rilevare un singolo bit di errore.

Uno schema in grado di fornire la correzione dell'errore a bit singolo prevede l'aggiunta di 4 bit ECC per parola di dati a 32 bit. Questo sembra essere aritmeticamente equivalente a 1 bit per byte, ma non può / non funziona in questo modo. Una parola dati a 36 bit può contenere informazioni sufficienti per recuperare da un errore a singolo bit per uno spazio dati a 32 bit.


0

8 bit. All'interno della CPU e della tastiera, è a 9 e 11 bit. I dati dell'utente sono rappresentati in 8 bit però. I tasti sulla tastiera inviano canti che sono divisi in 11 bit. 1 bit iniziale, 1 bit finale, 1 bit di parità e 8 bit che rappresentano un tasto premuto.


2
Questo risponde alla domanda? Intendi lunghezze diverse per byte in cpu e byte in tastiera? "Canta" dovrebbe essere "stringhe" o "flussi"?
Apass.Jack

Sembra che tu stia parlando di un protocollo wire che include i dati dell'inquadramento, non i dati effettivi stessi.
Peter Cordes,

Suppongo che "canta" sia "segnali", me stesso, @ Apass.Jack.
Justin Time 2 Ripristina Monica il
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.