2011-08-25 3 views
6

J'utilise C++ sous Linux 64 bits, le compilateur (g ++) est aussi 64 bits. Lorsque j'imprime l'adresse d'une variable, par exemple un nombre entier, il est supposé imprimer un entier de 64 bits, mais en fait il imprime un entier de 48 bits.Pointeur c + + sur machine 64 bits

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

Je me demande où sont les deux autres octets. Au plaisir de vous aider.

Merci.

+0

Combien de bits ne le numéro '1' avez? Souhaitez-vous vous plaindre que 'uint32_t x = 1;' n'a pas assez de bits? Vous devriez vérifier 'sizeof (* int)' plutôt que d'imprimer des choses. –

Répondre

7

L'impression d'adresses dans la plupart des implémentations C++ supprime les zéros en tête pour rendre les choses plus lisibles. Des choses comme 0x00000000000013fd n'ajoutent pas vraiment de valeur.

Lorsque vous vous demandez pourquoi vous verrez normalement rien de plus que les valeurs de 48 bits dans l'espace utilisateur, c'est parce que l'architecture AMD64 actuelle est simplement défini pour avoir 48bit de l'espace d'adressage virtuel (comme on peut le voir par exemple cat /proc/cpuinfo sur linux)

+0

Cet article de Wikipédia (oui, je sais) dit que la définition de l'architecture autorise jusqu'à 64 bits, mais les implémentations actuelles n'utilisent que 48. Est-ce que c'est faux? http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ Eh bien c'est une architecture "64bit" et nominalement les pointeurs sont 64bit. C'est juste que l'espace d'adresse virtuelle actuellement de 256 To est plus que suffisant et vous économisez des fils (et donc de la puissance) si vous pouvez juste supposer que les 16 bits les plus élevés de chaque pointeur sont zéro. – Voo

3

Ils sont là - ils ne sont allés nulle part - c'est juste le formatage dans le flux. Il ignore les zéros en tête (vérifiez les propriétés de remplissage et de largeur du flux).

EDIT: à la réflexion, je ne pense pas qu'il existe une bonne façon de changer la mise en forme pour les operator<< par défaut pour les pointeurs. Les attributs fill et width peuvent être modifiés si vous utilisez le manipulateur std::hex.

+0

Donc, si l'adresse d'un objet est 0x400c10, cela signifie que 5 octets de zéros en tête sont omis, non? – cheng

+1

@ user508305 Il peut, mais notez que tous les pointeurs ne sont pas nécessairement la même taille que la capacité d'adressage de la plate-forme. –

+0

Dans quel cas ont-ils une taille différente? Pouvez-vous en parler davantage ou simplement me donner quelques mots-clés pour que je puisse le google. – cheng

1

Pour le plaisir, vous pouvez utiliser la sortie C et voir si elle est plus comme ce que vous êtes après:

printf("0x%p"); 
Questions connexes