2016-10-30 2 views
1

J'apprends le pointeur dans c et j'ai ce programme que je prends d'un livre comme exemple.Pointer et représentation entière en mémoire

void print_bytes(void *start, size_t size); 

int main(int argc, char *argv[]) 
{ 
    int val = 42; 
    print_bytes(&val ,sizeof(val)); 

    return 0; 
} 

void print_bytes(void *start, size_t size) 
{ 
    int i = 0; 

    for(i = 0; i < size; i++) 
    { 
     printf("%02X ", *((unsigned char *)start + i)); 
    } 
} 

Je suis en train d'imprimer la valeur de chaque octets au format hexadecimal pointé par start pointer variable dans la fonction print_bytes.

Pour autant que je sais quand un integers variables sont stockées dans la mémoire, les variables sont stockées au format binaire.

Ceci est mon analyse si i exécuter le code: Supposons que le sizeof une variable entière est 4 bytes (32 bits) puis si la mémoire maintenir une valeur entière 42 alors la représentation en mémoire est la suivante:

42 pouvant servir qu'à en premier 8 représentation bit d'octets en mémoire.

binaire: 00000000000000000000000000101010

donc si je lance le code que je suis 2A. Jusqu'à présent, la sortie est correcte.

si la mémoire maintenir une valeur de nombre entier supérieur à 42, supposons 3000 (ce qui est certainement besoin de plus d'un seul octets pour représenter la valeur binaire dans la mémoire), la représentation en mémoire est la suivante:

binaire: 00000000 00000000 00001011 10111000 Si je cours le code j'ai obtenu 'B8 0B 00 00' qui me semble mal inséré BB 80 00 00.

S'il vous plaît quelqu'un expliquer ce qui ne va pas, je suis tryting pour résoudre ce pendant des heures, mais pas la moindre idée.

Merci d'avance. J'apprécierai chaque réponse et j'essaierai d'apprendre d'eux.

+2

S'il vous plaît lire ceci au sujet de [boutisme] (https://en.wikipedia.org/wiki/Endianness). –

+2

Vous avez fait un oubli dans le premier exemple en utilisant '42'. Le programme n'a pas simplement imprimé '2A' comme vous le dites, il a imprimé' 2A 00 00 00'. C'est-à-dire, l'octet le moins significatif en premier. –

Répondre

0

En bref, l'endianness ne s'applique pas aux bits seulement octets.

Quelle que soit la plate-forme que vous êtes va se comporter comme si les bits faibles sont à droite. Vous pouvez le dire parce que le décalage vers la droite (>>) réduit toujours une valeur ne l'augmente jamais.

Votre plate-forme est little-endian. Ainsi, la valeur binaire 00000000 00000000 00001011 10111000 (écrite au format premier chiffre de la convention la plus significative) est enregistrée sous la forme 10111000 00001011 00000000 00000000.

Notez que les bits ne sont pas inversés uniquement les octets. En le transformant en hexagone, on obtient:

10111000 00001011 00000000 00000000 
B 8 0 B 0 0 0 0 

Note de bas de page: Les bits stockés physiquement ne sont pas définis. Nous parlons de la façon dont la mémoire des ordinateurs est représentée logiquement en C. Pas comment les composants physiques sont arrangés.