7
votes

Comment chaque octet est-il dans un entier stocké dans la CPU / mémoire?

J'ai essayé ceci xxx

la sortie est comme:

89
0
0
0

Quel joli trains mon stomoche parce que je pensais que le nombre serait sauvé dans la mémoire comme 0x00000059 Alors, comment se fait-il que c [0] est 89? Je pensais que cela est censé être en C [3] ...


6 commentaires

Bienvenue dans le monde des machines X86 ...


Peut-être qu'il serait approprié de changer le titre. La question n'est pas vraiment sur la façon dont memcpy fonctionne, mais plutôt comment chaque octet dans un entier est stocké dans votre architecture


D'accord, comment puis-je faire ça


L'a fait pour vous - mais vous pouvez modifier votre poste vous-même en utilisant l'option "Modifier" sous les balises. Dans ce cas, il est juste en dessous de la balise "C ++" à gauche.


Est-ce la bonne façon d'accéder aux octets d'un entier? Qu'en est-il de l'alignement de la mémoire, etc.?


Otto: C'est parfaitement fin, car INT est un type de pod et cela signifie que vous pouvez mémoriser un tableau de caractères. Quant à bon .. c'est subjectif.


6 Réponses :


33
votes

Parce que le processeur que vous utilisez est Little-Endian . L'ordre des octets, d'un type fondamental multi-octets, est échangé. Sur une machine de grande endian, ce serait comme vous vous attendez.


4 commentaires

MDR. Choisir stupide_idiot lorsque votre nom d'écran signifie jamais avoir à dire "je suis désolé".


Notez également que vous ne pouvez pas supposer qu'un INT est de 4 octets longs. Toujours utiliser la taille de (int). La seule chose à propos de la taille des variables que je me sentirais à l'aise en supposant que la taille de la taille de (caractère) est de 1.


battu par quelques secondes :)


C'est pourquoi j'ai choisi ça :), les gens expliquent généralement des choses beaucoup plus simples si votre pseudo est stupide idiot :)))) C'est un peu bien pour ma personne: D



12
votes

C'est parce que vous exécutez le programme sur un Little Endian CPU. Voir aussi Endiangness ici et .


0 commentaires

9
votes

Endian-Ness est évidemment la réponse que GoZ a souligné.

Mais pour ceux qui ne sont pas clairs de ce que cela signifie, il est également important de comprendre que l'ordre des octets affichés dans l'exemple est identique à la commande dans l'INT d'origine. MemCpy ne change pas l'ordre des octets, quel que soit le type edian de la plate-forme.


0 commentaires

2
votes

Différentes machines peuvent avoir un ordre d'octets différent, mais jetez un coup d'œil à ce code et réfléchissez à ce qui se passe, en fonction de la base des octets:

long x = 89;
short *p = (short*)&x;
short y = *p;


0 commentaires

1
votes

Si vous souhaitez que votre application soit portable ou développée au sein d'une équipe, vous ne voulez probablement pas suivre cette logique car elle causerait du mal à attraper des bugs et de prolonger le développement.


0 commentaires

6
votes

Parce que l'ordre d'octet est une décision de conception arbitraire. Une fois dans un registre, il n'y a pas d'ordre d'octet 1 .

L'ordre des octets se pose lorsque nous abordons des unités plus petites comme des octets. C'est une décision essentiellement arbitraire que le concepteur de la CPU obtient: Big-Endian ou Little-Endian.

Il est utile de simplifier la situation et de se rendre compte qu'il s'agit principalement de la connexion à des périphériques d'octets commandés. Oui, il peut être découvert via l'adressage des octets comme vous l'avez prouvé, mais dans des valeurs générales scalaires sont chargées et stockées comme des unités, dans des registres, et dans ce cas, l'ordre des octets ne change rien. Les bits les plus significatifs sont sur "la gauche", du moins, la façon dont nous écrivons habituellement des nombres. Et c'est pourquoi le <<< / code> et >> Les opérateurs produisent toujours les mêmes résultats sur les machines de Big-Endian VS Little-Endian lorsqu'ils sont utilisés conformément aux normes de langue.

Mais pour lire et écrire des flux de données sur des périphériques, vous êtes obligé de choisir un ordre d'octets. En effet, les périphériques sont des périphériques de flux d'octets fondamentalement. L'adresse la plus basse a-t-elle les bits les plus importants ou le moins? Cela fait les deux manières et les camps étaient plutôt divisés uniformément.

Parce que la mémoire elle-même est une octet adressée, il est certainement possible de dériver un comportement différent sans périphérique, mais cela ne se produit généralement pas sans piquet délibéré à l'intérieur comme vous l'avez fait.

Imaginez une CPU qui n'a pas d'octets, seulement des mots 32 bits, adressés à 0, 1, 2. Le compilateur C constitue de char, int et long tous les objets 32 bits. (Ceci est autorisé par CX9.) WOW, pas de problèmes d'ordre d'octets! C'est à la fois! Mais .. que se passe-t-il lorsque nous raccordons notre premier périphérique ??


1. Eh bien, X86 a des registres que Alias ​​se comporte, mais c'est une autre histoire.


1 commentaires

Je pourrais également noter que beaucoup de machines (CDC, Cray, Dec-10/20, beaucoup d'autres) ont été réalisées avec diverses longueurs de mots, mais sinon comme mon imaginaire dans le dernier paragraphe. Un compilateur, une API ou une bibliothèque peut alors définir une commande pour les tableaux de caractères emballés, une bibliothèque ou un système logiciel peut donc avoir eu une sorte d'ordre d'octets, mais la machine sous-jacente ne l'a pas encore fait.