web-dev-qa-db-fra.com

Opérateurs au niveau du bit et "endianité"

endianité importe-t-il du tout avec les opérations au niveau du bit? Soit logique ou décalage?

Je travaille sur les devoirs en ce qui concerne les opérateurs au niveau du bit, et je ne peux pas faire de têtes ou de queues dessus, et je pense que je suis assez accroché à l'endianess. Autrement dit, j'utilise une petite machine endienne (comme la plupart le sont), mais cela doit-il être pris en considération ou est-ce un fait inutile?

Au cas où ça compte, j'utilise C.

65
Frank V

L'endianisme 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 pour être opérées, l'endianité est complètement hors de propos. Les décalages, les opérations au niveau du bit, etc., fonctionnent comme vous vous y attendez (les données sont logiquement présentées sous forme de bits de poids faible à élevés), quelle que soit l'endianité.

68
Michael

Les opérateurs au niveau du bit font abstraction de l'endianité. Par exemple, le >> L'opérateur déplace toujours les bits vers le chiffre le moins significatif. Cependant, cela ne signifie pas que vous pouvez ignorer complètement l'endianité lorsque vous les utilisez, 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 fondamental 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 en termes d'endian, vous ne pouvez pas ignorer l'effet de l'endianess dans votre code, en particulier lorsqu'ils sont combinés avec d'autres opérateurs.

61
1800 INFORMATION

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'endianité, mais la mise en œuvre d'un décalage à droite peut varier selon que l'architecture utilise l'arithmétique du complément à un ou des compléments à deux.

5
rpetrich

Ça dépend. Sans transposer le nombre dans un nouveau type, vous pouvez traiter l'endianité de manière transparente.

Cependant, si votre opération implique une nouvelle coulée de type, faites preuve de prudence.

Par exemple, si vous voulez décaler à droite certains bits et convertir (explicitement ou non) en un nouveau type, l'endianité est importante!

Pour tester votre endianité, vous pouvez simplement convertir un int en char:

int i = 1;

char *ptr;

...

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

return  (*ptr);
3
Rongkai Xu

Vous n'avez pas spécifié de langage, mais généralement, les langages de programmation tels que l'endianisme abstrait C s'éloignent dans les opérations au niveau du bit. Donc non, cela n'a pas d'importance dans les opérations au niveau du bit.

1
Mehrdad Afshari