différence entre imprimer une adresse mémoire en utilisant% u et% d en C?
J'ai de la lecture d'un C livre. Pour imprimer une adresse mémoire d'une variable, parfois, le livre utilise:
printf("%u\n",&n);
Parfois, l'auteur a écrit:
printf("%d\n",&n);
Le résultat est toujours le même, mais je ne comprends pas les différences entre les deux (je sais, %u pour les non signé).
Quelqu'un peut-il fournir des précisions sur ce, s'il vous plaît?
Merci beaucoup.
source d'informationauteur ipkiss
Vous devez vous connecter pour publier un commentaire.
%u
traite les entiers non signés, alors que%d
traite l'entier signé. Si l'entier est entre 0 etINT_MAX
(qui est de 231-1 sur les systèmes 32 bits), alors la sortie est identique pour les deux cas.Il ne fait une différence si l'entier est négatif (pour la signature d'entrées) ou entre
INT_MAX+1
etUINT_MAX
(par exemple, entre 231 et 232-1). Dans ce cas, si vous utilisez le%d
rédacteur de devis, vous obtiendrez un nombre négatif, tandis que si vous utilisez%u
vous obtiendrez un grand nombre positif.Adresses n'ont de sens que comme des nombres non signés, donc il n'y a jamais aucune raison de les imprimer comme des nombres signés. En outre, quand ils sont imprimés, ils sont généralement imprimés en hexadécimal (avec le
%x
spécificateur de format), pas de décimale.Vous devriez vraiment utiliser le
%p
spécificateur de format pour les adresses, cependant—il est garanti de fonctionner pour tous les pointeurs valides. Si vous êtes sur un système avec des nombres entiers de 32 bits, mais les pointeurs 64 bits, si vous essayez d'imprimer un pointeur avec tout de%d
%u
ou%x
sansll
modificateur de longueur, vous aurez le mauvais résultat de ce et tout ce qui est imprimé plus tard (parce queprintf
lire seulement 4 des 8 octets de l'argument pointeur); si vous ajoutez lell
modificateur de longueur, alors vous ne serez pas portable pour les systèmes 32 bits.Ligne du bas: toujours utiliser
%p
pour l'impression des pointeurs/adresse:Exactement le format de sortie est mise en œuvre définies (C99 §7.19.6.1/8), mais il sera presque toujours être imprimés sous forme de nombre hexadécimal non signé, habituellement avec l'un des principaux
0x
.%d
et%u
imprime les mêmes résultats lorsque le bit le plus significatif n'est pas définie. Cependant, ce n'est pas un code portable à tous, et n'est pas un bon style. J'espère que votre livre est meilleur que ce qu'il semble à partir de cet exemple.Quelle valeur avez-vous essayé? La différence unsigned vs signé, comme vous l'avez dit vous savez. Que faisait-il et à quoi vous attendiez-vous?
Positive des valeurs signées le même aspect que non signé, je peux donc supposer que vous avez utilisé une valeur inférieure à tester? Quid d'une valeur négative?
Enfin, si vous tentez d'imprimer la variable adresse (comme il semble que vous êtes), utilisez %p à la place.
Toutes les adresses ne sont pas signés de 32 bits ou 64 bits en fonction de la machine (ne peut pas écrire dans un négatif de l'adresse). L'utilisation de %d n'est pas approprié, mais en général. Il est recommandé d'utiliser le %u et %ul.