web-dev-qa-db-fra.com

formatage printf (% d contre% u)

Quelle est la différence entre %d et %u lors de l'impression des adresses de pointeurs?

Par exemple:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
15
kapil

Vous pouvez trouver une liste des échappements de formatage sur cette page .

%d est un entier signé, tandis que %u est un entier non signé. Les pointeurs (lorsqu'ils sont traités comme des nombres) ne sont généralement pas négatifs.

Si vous voulez réellement afficher un pointeur, utilisez le %p spécificateur de format.

27
GManNickG

% u imprime un entier non signé

% d imprime un entier signé

pour obtenir une adresse de pointeur, utilisez % p

Autre liste des mises en forme d'échappement:

Voici la liste complète des échappements de formatage. Je donne juste une capture d'écran de cette page

enter image description here

7
alamin

Si je comprends bien votre question, vous avez besoin de %p pour afficher l'adresse utilisée par un pointeur, par exemple:

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

produira quelque chose comme:

-1083791044, 3211176252, 0xbf66a93c
6
Luca Matteis

% u est utilisé pour un entier non signé. Étant donné que l'adresse mémoire donnée par l'opérateur d'adresse entière signée% d est -12, pour obtenir cette valeur en entier non signé, le compilateur renvoie la valeur entière non signée pour cette adresse.

1
user2560622

La différence est simple: ils provoquent l'émission de différents messages d'avertissement lors de la compilation:

1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %d\n", &a); // prints "memory add=-12"
                               ^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %u\n", &a); // prints "memory add=65456"
                               ^

Si vous passez votre pointeur en tant que void* et utilise %p comme spécificateur de conversion, vous n'obtenez aucun message d'erreur:

#include <stdio.h>

int main()
{
    int a = 5;
    // check the memory address
    printf("memory address = %d\n", &a); /* wrong */
    printf("memory address = %u\n", &a); /* wrong */
    printf("memory address = %p\n", (void*)&a); /* right */
}
1
Toby Speight