2009-06-24 26 views
63

importa con le operazioni bit a bit? O logical o spostando?Operatori bit a bit e "endianness"

Sto lavorando sui compiti relativi agli operatori bit a bit, e non riesco a farci testa o croce, e penso che mi stia facendo un sacco di problemi con l'endianess. Cioè, sto usando una piccola macchina endian (come la maggior parte sono), ma questo deve essere considerato o è un fatto sprecato?

Nel caso in cui le cose, sto usando C.

+0

Duplicate: http://stackoverflow.com/questions/7184789/does-bit-shift-depends-on-endianness – 0andriy

risposta

65

Endianness conta solo per il layout dei dati in memoria. Non appena i dati vengono caricati dal processore su cui operare, endianness è completamente irrilevante. Spostamenti, operazioni bit a bit e così via si comportano come ci si aspetterebbe (i dati sono disposti logicamente come bit di ordine basso in alto) indipendentemente dall'endianness.

+19

Non dovrebbe essere logicamente "alto al bit di basso ordine"? – legends2k

+1

@ legends2k: aveva lo stesso pensiero –

+0

@ legends2k: sì. Spostamento a sinistra = moltiplicazione per potenza di 2. Spostamento a destra = divisione per potenza di 2 (con arrotondamenti diversi rispetto alla divisione intera per valori negativi). –

1

Non è stata specificata una lingua, ma di solito, linguaggi di programmazione come C endianness astratto via in operazioni bit per bit. Quindi no, non importa nelle operazioni bit a bit.

+1

Dato che la domanda non ha revisioni, sono sorpreso che tu dica che non ha menzionato la lingua, quando lo fa, ed è anche etichettato come C. –

+2

@ Simeon: non ha avuto al momento in cui ho scritto questa risposta. Le modifiche di un singolo autore in un breve intervallo di tempo verranno unite in una sola. Ecco perché la vedi come una singola revisione. –

60

Gli operatori bit a bit estrapolano l'endianità. Ad esempio, l'operatore >> sposta sempre i bit verso la cifra meno significativa. Tuttavia, questo non significa che sei sicuro di ignorare completamente l'endianità quando li usi, ad esempio quando gestisci singoli byte in una struttura più grande non puoi sempre presumere che cadrà nello stesso posto.

short temp = 0x1234; 
temp = temp >> 8; 

// on little endian, c will be 0x12, on big endian, it will be 0x0 
char c=((char*)&temp)[0]; 

Per chiarire, non sono in disaccordo di base con le altre risposte qui. Il punto che sto cercando di fare è sottolineare che sebbene gli operatori bit a bit siano essenzialmente endian neutral, non è possibile ignorare l'effetto di endianess nel codice, specialmente se combinato con altri operatori.

+1

Sei sostanzialmente in disaccordo con tutti ma la tua risposta è stata votata la migliore. Come può identificare i comportamenti? –

+0

Ho aggiunto qualche ulteriore chiarimento –

+1

Quindi per chiarire ulteriormente intendi se, a meno che non stia effettivamente recuperando i valori in byte, va tutto bene? –

4

Come altri hanno menzionato, gli spostamenti sono definiti dalle specifiche del linguaggio C e sono indipendenti dall'endianness, ma l'implementazione di uno spostamento a destra può variare a seconda che l'architettura utilizzi il complemento o l'aritmetica del complemento a due.

1

Dipende. Senza convertire il numero in un nuovo tipo, puoi trattare l'endianità in modo trasparente.

Tuttavia, se l'operazione comporta un nuovo tipo di trasmissione, quindi utilizzare l'attenzione.

Ad esempio, se si desidera spostare a destra alcuni bit e trasmettere (esplicitamente o meno) a un nuovo tipo, l'endianità conta!

Per provare l'endianness, si può semplicemente lanciare un int in un char:

int i = 1; 

char *ptr; 

... 

ptr = (char *) &i; //Cast it here 

return (*ptr); 
+0

... Oppure crea un'unione ... '{union {int i = 1; char a [4];} b; return b.a [3] == 1;} // big endian' –

Problemi correlati