206 votes

Décalage de bits dépend de "endianness" ?

Supposons que j'ai le nombre 'numb'=1025 [00000000 00000000 00000100 00000001] représenté:

Sur Little-Endian Machine:

00000001 00000100 00000000 00000000

En Big-Endian Machine:

00000000 00000000 00000100 00000001

Maintenant, si je demande une Maj Gauche sur 10 bits (c'est à dire: numb <<= 10), je devrais avoir:

[A] Sur Little-Endian Machine:

Comme je l'ai remarqué dans GDB, Little Endian ne la touche Maj Gauche en 3 étapes: [je l'ai montré, '3' des Mesures afin de mieux comprendre le traitement seulement]

  1. Traiter le pas. en Big-Endian Convention:

    00000000        00000000        00000100    00000001
    
  2. Appliquer Le Décalage Vers La Gauche:

    00000000        00010000        00000100        00000000
    
  3. Représenter le Résultat de nouveau en Little-Endian:

    00000000        00000100        00010000        00000000 
    

[B]. En Big-Endian Machine:

00000000        00010000        00000100        00000000

Ma Question est:

Si j'directement appliquer un Décalage à Gauche sur le Little Endian Convention, il devrait donner:

numb:

00000001 00000100 00000000 00000000

numb << 10:

00010000 00000000 00000000 00000000

Mais en fait, ça donne:

00000000        00000100        00010000        00000000 

Pour atteindre le deuxième résultat seulement, j'ai montré trois hypothétique étapes ci-dessus.

Merci de m'expliquer pourquoi ces deux résultats sont différents: Le résultat réel de l' numb << 10 est différent du résultat attendu.

249voto

C.. Points 10739

"Endianness" est la façon dont les valeurs sont stockées dans la mémoire. Lors du chargement dans le processeur, quelle que soit "endianness", l’instruction de décalage de bits fonctionne sur la valeur dans le Registre du processeur. Par conséquent, chargement de la mémoire au processeur est l’équivalent de la conversion en gros-boutiste, l’opération de déplacement vient ensuite et puis la nouvelle valeur est stockée en mémoire, ce qui est de l’ordre d’octet avec primauté des little, où entre en vigueur à nouveau.

78voto

Kerrek SB Points 194696

Non, bitshift, comme toute autre partie de C, est défini en termes de valeurs, pas de représentations. Décalage vers la gauche par 1 mutliplication par 2, décalage vers la droite est la division. (Comme toujours lors de l’utilisation d’opérations de bits, Méfiez-vous des signedness. Tout est plus bien défini pour les types intégraux non signés).

6voto

Raymond Chen Points 27887

Les ordinateurs ne pas écrire les nombres en bas de la manière dont nous le faisons. La valeur passe simplement. Si vous insistez sur la recherche à l'octet-par-octet (même si ce n'est pas la façon dont l'ordinateur), vous pourriez dire que sur un little-endian machine, le premier octet quarts à gauche, l'excès de bits d'aller dans le deuxième octet, et ainsi de suite.

(En passant, little-endian a plus de sens si vous écrivez les octets verticalement plutôt qu'horizontalement, avec des adresses sur le dessus. Qui se trouve être la façon dont la mémoire de la carte diagrammes sont souvent tirées.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X