Pourquoi le numéro d’adresse n’est pas égal en dec et en hexadécimal?

debian@debian:~$ cat /tmp/test.c #include int main(void) { int m=1; printf("m=%d\n",&m); printf("m=%p\n",&m); } debian@debian:~$ gcc /tmp/test.c -o /tmp/test.exe debian@debian:~$ /tmp/test.exe m=-1078061268 m=0xbfbe172c debian@debian:~$ python Python 2.7.3 (default, Jan 2 2013, 16:53:07) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print hex(-1078061268) -0x4041e8d4 

pourquoi le -1078061268 en dec n’est pas egal 0xbfbe172c en hexa?

Ils sont les mêmes, vous comparez signé signé à non signé.

Regardez ici les formats.

 #include int main(void) { int m=1; printf("m=%u\n",&m); // 3219008780 printf("m=%p\n",&m); // 0xbfde2d0c } 

il est. en complément de 2.

 >>> hex(2**32-1078061268) '0xbfbe172c' 

Une adresse n’est pas un int. si votre machine est 32 bits, il s’agit d’un entier non signé (en fait, uint32_t ). sinon, c’est un uint64_t . il est toujours prudent de le mettre dans un uintptr_t et de l’imprimer avec %p .

La première instruction printf traite l’adresse comme un entier signé. La seconde consiste à le traiter comme un pointeur (ce qui, pour printf, revient à l’imprimer sous forme de nombre hexadécimal non signé). Ces deux nombres ont la même représentation binary dans l’arithmétique du complément à deux, bien qu’ils ne soient pas numériquement égaux. C’est pourquoi les comparaisons entre les valeurs signées et non signées sont une mauvaise idée.