Operatori bit a bit e “endianness”

L’ endianità conta affatto con le operazioni bit a bit? O logico o mutevole?

Sto lavorando sui compiti relativi agli operatori bit a bit, e non riesco a farmi testa o croce, e penso che mi stancherà del tutto con l’endianess. Cioè, sto usando una piccola macchina endian (come la maggior parte sono), ma questo deve essere considerato o è un fatto sprecato?

Se è importante, sto usando C.

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.

Gli operatori bit a bit allontanano 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 è ansible ignorare l’effetto di endianess nel codice, specialmente se combinato con altri operatori.

Come altri hanno menzionato, i turni 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.

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

Tuttavia, se la tua operazione prevede alcune nuove tipologie di casting, quindi usa la tua attenzione.

Ad esempio, se vuoi spostare a destra alcuni bit e cast (esplicitamente o meno) in un nuovo tipo, l’endianness conta!

Per testare la tua endianità, puoi semplicemente lanciare un int in un char :

 int i = 1; char *ptr; ... ptr = (char *) &i; //Cast it here return (*ptr); 

Non hai specificato una lingua, ma di solito, linguaggi di programmazione come C abstract endianness in operazioni bit a bit. Quindi no, non importa nelle operazioni bit a bit.