Supposons que j'ai le nombre 'numb'=1025 [00000000 00000000 00000100 00000001]
représentée:
Sur Little-Endian Machine:
00000001 00000100 00000000 00000000
Sur la machine Big-Endian:
00000000 00000000 00000100 00000001
Maintenant, si j'applique le décalage gauche sur 10 bits (c'est-à-dire: engourdi << = 10), je devrais avoir:
[A] Sur la machine Little-Endian:
Comme je l'ai remarqué dans GDB, Little Endian effectue le décalage vers la gauche en 3 étapes: [J'ai montré les étapes "3" pour mieux comprendre le traitement uniquement]
Traitez le non. dans la Convention Big-Endian:
00000000 00000000 00000100 00000001
Appliquer le décalage vers la gauche:
00000000 00010000 00000100 00000000
Représentez à nouveau le résultat en Little-Endian:
00000000 00000100 00010000 00000000
[B]. Sur la machine Big-Endian:
00000000 00010000 00000100 00000000
Ma question est:
Si j'applique directement un décalage à gauche sur la Convention de Little Endian, cela devrait donner:
numb
:
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
Mais en réalité, cela donne:
00000000 00000100 00010000 00000000
Pour atteindre le deuxième résultat seulement, j'ai montré trois étapes hypothétiques ci-dessus.
Veuillez m'expliquer pourquoi les deux résultats ci-dessus sont différents: le résultat réel de numb << 10
est différent du résultat attendu.
L'endianisme est la façon dont les valeurs sont stockées en mémoire. Lorsqu'elle est chargée dans le processeur, quelle que soit l'endianité, l'instruction de décalage de bit fonctionne sur la valeur dans le registre du processeur. Par conséquent, le chargement de la mémoire vers le processeur équivaut à la conversion en big endian, l'opération de décalage vient ensuite, puis la nouvelle valeur est stockée en mémoire, c'est là que l'ordre des octets du petit endian entre à nouveau en vigueur.
Mise à jour, grâce à @jww: Sur PowerPC, le vecteur se déplace et tourne est sensible à l'endian. Vous pouvez avoir une valeur dans un registre vectoriel et un décalage produira des résultats différents sur petit-boutien et gros-boutien .
Non, le décalage de bits, comme toute autre partie de C, est défini en termes de valeurs, pas de représentations. Décalage à gauche de 1 est la multiplication par 2, décalage à droite est la division. (Comme toujours lors de l'utilisation d'opérations au niveau du bit, méfiez-vous de la signature. Tout est mieux défini pour les types intégraux non signés.)
Quelle que soit l'instruction de décalage qui décale les bits d'ordre supérieur en premier, elle est considérée comme le décalage vers la gauche. Quelle que soit l'instruction de décalage qui décale les bits de poids faible en premier, est considérée comme le décalage à droite. En ce sens, le comportement de >>
et <<
pour unsigned
les nombres ne dépendront pas de l'endianité.
Les ordinateurs n'écrivent pas les chiffres comme nous le faisons. La valeur change simplement. Si vous insistez pour le regarder octet par octet (même si ce n'est pas la façon dont l'ordinateur le fait), vous pourriez dire que sur une machine peu endienne, le premier octet se décale vers la gauche, les bits en excès vont dans le deuxième octet, etc.
(Soit dit en passant, little-endian a plus de sens si vous écrivez les octets verticalement plutôt qu'horizontalement, avec des adresses plus élevées en haut. Ce qui se trouve être la façon dont les diagrammes de carte mémoire sont généralement dessinés.)