2013-05-28 15 views
14

Sto leggendo "L'apprendimento Core Audio: A Hands-On Guide to Audio programmazione per Mac e iOS" di Chris Adamson e ad un certo punto l'autore descrive big-endian come:L'endianness può riferirsi all'ordine dei bit in un byte?

gli alti bit di un il byte o la parola sono numericamente più significativi di quelli inferiori.

Tuttavia, fino ad ora ho anche il problema della big-little endian si applica solo a byte ordine e non ordine bit. Un byte ha lo stesso ordine di bit (da sinistra a destra), non importa se stiamo parlando di piccoli sistemi endian o big endian. Ho sbagliato? L'autore è sbagliato? O ho frainteso il suo punto?

risposta

12

Poiché non è possibile indirizzare normalmente i bit all'interno di un byte singolarmente, non esiste generalmente il concetto di "bit endianness".

+2

Tuttavia, quando si eseguono operazioni bit a bit come lo spostamento, non li si "indirizza"? – Meda

+3

Quando si cambia, si gestiscono ancora i bit come parte di un'unità più grande (byte, int o qualcosa). L'endianità conta solo quando è possibile indirizzare direttamente un oggetto più grande byte per byte: è necessario sapere in che modo questi byte individualmente indirizzabili sono disposti all'interno dell'oggetto più grande. –

+3

@Meda quando sei al livello del bit shifting di un singolo byte è "rappresentazione" (il numero a cui corrisponde) può scomporsi ed è solo una raccolta arbitraria di 1 e 0. Le istruzioni trasmesse per ruotare (ROL, ROR, RCL, RCR) o shift (SHL, SHR ...) in una determinata "direzione" sono astratte come i numeri stessi. –

7

L'unico senso in cui esiste una cosa come "ordine bit" è l'ordine in cui i bit vengono assegnati ai bitfield. Ad esempio, in:

union { 
    struct { 
     unsigned char a:4; 
     unsigned char b:4; 
    } bf; 
    unsigned char c; 
}; 

seconda dell'implementazione, la rappresentazione di bf.a potrebbe occupare le alte quattro bit di c, o dalle basse quattro bit di c. Se l'ordinamento dei membri bitfield corrisponde all'ordine dei byte è definito dall'implementazione.

6

La "endianità" di un byte in termini di bit-order non è davvero una preoccupazione a meno che non si stia lavorando con un sistema esotico che consente di indirizzare i bit separatamente. Può essere una preoccupazione quando si decide come trasmettere i dati sul filo, ma questa decisione viene solitamente presa a livello hardware.

Audio

In termini di rilevanza per streaming audio, potrebbe benissimo essere importante. L'hardware responsabile della conversione del flusso dell'audio digitale in segnali audio analogici potrebbe aspettarsi che i bit nel flusso si trovino in un ordine particolare. Se hanno torto, il suono potrebbe venire completamente colpito. Forse l'autore del tuo libro ci parla di questo? Ad ogni modo, come ho detto prima, questo è normalmente deciso a livello hardware e non è davvero un problema quando si programma a un utente o addirittura a un kernel. In generale, gli standard di settore definiranno il modo in cui due pezzi di hardware trasmetteranno i dati l'uno all'altro. Finché tutto il tuo hardware è d'accordo sul bit endianness, allora va tutto bene.

Further reading at Wikipedia.

+0

+1 per aver menzionato l'ordine di trasmissione seriale. Questo non è direttamente rilevante per il linguaggio C, ma è ovviamente rilevante per molti usi di C. –

2

L'ordine dei bit all'interno di un byte non ha senso, bit all'interno di un byte non sono indirizzabili in modo non è possibile definire un ordine di questi bit di usarlo come riferimento per la definizione di endianness . A differenza dei bit, i byte sono indirizzabili, quindi esiste un ordine di indirizzo che possiamo usare come riferimento per definire cosa significa little o big endian.

Si può avere l'impressione che Left shift << o Right Shift >> gli operatori bit-bit implichino indirettamente che esiste un ordine definito di bit all'interno di un byte, ma ciò non è vero. Questi due termini si basano su una rappresentazione astratta di byte in cui il bit più basso si trova a destra e i bit diventano più alti quando si va a sinistra, ma per definizione Left shift ha lo stesso effetto della moltiplicazione per 2 e Right shift ha lo stesso effetto della divisione da 2 (per interi senza segno).