¿Por qué el número de dirección no es igual en dec y en hexadecimal?

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 

¿Por qué el -1078061268 en dec no es igual a 0xbfbe172c en hexadecimal?

Son los mismos, estás comparando firmados a no firmados.

Echa un vistazo aquí a los formatos.

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

es. En complemento a 2.

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

Una dirección no es un int. Si su máquina es de 32 bits, es un int sin signo (de hecho, uint32_t ). Si no, es un uint64_t . siempre es seguro colocarlo en un uintptr_t e imprimirlo con %p .

La primera statement printf trata la dirección como un entero con signo. El segundo es que el tratamiento es un puntero (que, para printf, equivale a imprimirlo como un número hex sin signo). Esos dos números tienen la misma representación binaria en la aritmética del complemento de dos, aunque no son numéricamente iguales. Esta es la razón por la que las comparaciones entre valores firmados y no firmados son una mala idea.