(Je pense que cette question pourrait s'appliquer à de nombreux langages à typage, mais j'ai choisi d'utiliser le C++ comme un exemple.)
Pourquoi n'est-il pas moyen de simplement écrire:
struct foo {
little int x; // little-endian
big long int y; // big-endian
short z; // native endianness
};
pour spécifier le boutisme de certains membres, les variables et les paramètres?
La comparaison de ce paramètre
Je comprends que le type d'une variable détermine non seulement le nombre d'octets utilisés pour stocker une valeur, mais aussi la façon dont ces octets sont interprétés lors de l'exécution des calculs.
Par exemple, ces deux déclarations chaque allouer un octet, et pour les deux octets, chaque séquence 8-bit est une valeur valide:
signed char s;
unsigned char u;
mais la même séquence binaire pourrait être interprétée différemment, par exemple, 11111111
signifierait -1 lorsqu' s
mais 255 lorsqu' u
. Lorsque signés et non signés, les variables sont impliquées dans le même calcul, le compilateur (pour la plupart) prend en charge les conversions.
Dans ma compréhension, endianness est juste une variation du même principe: une interprétation différente d'un modèle binaire basée sur la compilation de l'information à propos de la mémoire dans lequel elle sera enregistrée.
Il semble évident pour avoir cette fonctionnalité dans un typée de la langue qui permet la programmation de bas niveau. Cependant, ce n'est pas une partie de C, C++ ou tout autre langage que je connais, et je n'ai pas trouver toutes les discussions sur ce sujet en ligne.
Mise à jour
Je vais essayer de résumer certains plats à emporter à partir des nombreux commentaires que j'ai reçu dans la première heure après avoir poser la question:
- ce paramètre est strictement binaire (soit signé ou non signé), et sera toujours, contrairement à l'endianness, qui a également deux variantes (grand et petit), mais également des variantes moins connues comme mixte/moyen-endian. De nouvelles variantes peuvent être inventé dans le futur.
- endianness questions lors de l'accès à plusieurs valeurs d'octets octet-sage. Il ya de nombreux aspects-delà de l'endianness qui affectent la mémoire mise en page multi-octets, de façon à ce type d'accès est surtout découragé.
- C++ a pour objectif d'une machine abstraite et réduire le nombre d'hypothèses à propos de la mise en œuvre. Cette machine abstraite ne dispose pas de toute l'endianness.
Aussi, maintenant, je me rends compte que ce paramètre et de stockage ne sont pas d'une parfaite analogie, parce que:
- endianness définit seulement la façon dont quelque chose est représenté comme une séquence binaire, mais maintenant ce qui peut être représenté. Les deux
big int
etlittle int
aurait exactement la même gamme de valeur. - ce paramètre définit la façon dont les bits les valeurs réelles et de mapper les uns aux autres, mais aussi sur ce qui peut être représentée, par exemple, -3 ne peuvent pas être représentés par un
unsigned char
et (en supposant que l'char
a 8 bits) 130 peut pas être représenté par unsigned char
.
De sorte que la modification de l'endianness de certaines variables ne serait jamais changer le comportement du programme (sauf pour les byte-sage d'accès), alors un changement de ce paramètre habituellement.