2009-06-24 6 views
63

Est-ce que endianness est concerné par les opérations sur les bits? Soit logical ou en décalage? Je travaille sur les devoirs en ce qui concerne les opérateurs bit à bit, et je ne peux pas faire la tête ou la queue, et je pense que je suis assez bloqué sur l'endianess. C'est-à-dire que j'utilise une petite machine d'endian (comme la plupart le sont), mais est-ce que cela doit être considéré ou est-ce un fait perdu?Opérateurs bit à bit et «endianness»

Dans le cas où il importe, j'utilise C.

+0

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

Répondre

65

L'endianness n'a d'importance que pour la disposition des données en mémoire. Dès que les données sont chargées par le processeur à opérer, l'endianness est complètement irrelevant. Les décalages, les opérations au niveau du bit, etc. fonctionnent comme prévu (les données sont logiquement présentées comme des bits de poids faible à élevé) indépendamment de l'endianness.

+19

Ne devrait-il pas être logique de "haut à bas"? – legends2k

+1

@ legends2k: avait la même pensée –

+0

@ legends2k: oui. Décalage gauche = multiplier par la puissance de 2. Décalage droit = ​​diviser par la puissance de 2 (avec un arrondi différent de la division entière pour les valeurs négatives). –

1

Vous n'avez pas spécifié une langue, mais en général, les langages de programmation tels que C abstrait boutisme loin dans les opérations de manipulation de bits. Donc non, cela n'a pas d'importance dans les opérations au niveau du bit.

+1

Étant donné que la question n'a aucune révision, je suis surpris que vous disiez qu'il n'a pas mentionné la langue, quand il le fait, et il est également marqué comme C. –

+2

@ Siméon: Il n'avait pas au moment où j'ai écrit cette réponse. Les modifications effectuées par un seul auteur dans un court laps de temps seront fusionnées en une seule. C'est pourquoi vous le voyez comme une seule révision. –

60

Les opérateurs de bits éliminent l'endianness. Par exemple, l'opérateur >> décale toujours les bits vers le chiffre le moins significatif. Cependant, cela ne signifie pas que vous pouvez ignorer complètement l'endianness en les utilisant, par exemple lorsque vous traitez des octets individuels dans une structure plus grande, vous ne pouvez pas toujours supposer qu'ils tomberont au même endroit.

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]; 

Pour clarifier, je ne suis pas en désaccord de base avec les autres réponses ici. Le point que j'essaye de faire est de souligner que bien que les opérateurs au niveau du bit soient essentiellement neutres endian, vous ne pouvez pas ignorer l'effet de l'endianess dans votre code, surtout lorsqu'il est combiné avec d'autres opérateurs.

+1

Vous êtes fondamentalement en désaccord avec tout le monde, mais votre réponse a été votée le meilleur. Comment identifier les comportements? –

+0

J'ai ajouté quelques clarifications supplémentaires –

+1

Donc, pour clarifier davantage, vous voulez dire si, à moins que je ne récupère réellement des valeurs en octets, tout va bien? –

4

Comme d'autres l'ont mentionné, les décalages sont définis par la spécification du langage C et sont indépendants de l'endianness, mais l'implémentation d'un décalage droit peut varier selon que l'architecture utilise son complément ou son complément arithmétique.

1

Cela dépend. Sans transformer le nombre en un nouveau type, vous pouvez traiter l'endianness de manière transparente. Toutefois, si votre opération implique un nouveau type de casting, utilisez votre prudence. Par exemple, si vous voulez déplacer légèrement certains bits et les transtyper (explicitement ou non) vers un nouveau type, l'endianness est important!

Pour tester votre boutisme, vous pouvez simplement jeter un coup int en char:

int i = 1; 

char *ptr; 

... 

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

return (*ptr); 
+0

... Ou créez une union ... '{union {int i = 1; char a [4];} b; renvoie b.a [3] == 1;} // gros endien' –