2009-06-19 4 views
1

Quelqu'un peut-il expliquer le comportement étrange suivant?Les 32 bits les plus significatifs perdus lors de la conversion du pointeur en int64_t

-je exécuter le programme suivant sur une plate-forme Intel 64 bits:

include <stdio.h> 
#include <stdint.h> 

int main(void) 
{ 
    int x; 
    int *ptr = &x; 

    printf("ptr = %p\n", ptr); 
    printf("sizeof(ptr) = %d\n", sizeof(ptr)); 

    int64_t i1 = (int64_t) ptr; 
    printf("i1 = 0x%x\n", i1); 
    printf("sizeof(i1) = %d\n", sizeof(i1)); 

    return 0; 
} 

Ce programme produit la sortie suivante:

ptr = 0x7fbfffdf2c 
sizeof(ptr) = 8 
i1 = 0xbfffdf2c 
sizeof(i1) = 8 

Quelqu'un peut-il expliquer pourquoi i1 ne contient que les moins 32 bits significatifs de ptr? (Notez qu'il manque 0x7f).

Compiler: gcc version 3.4.6 20060404 (Red Hat 3.4.6-9) 
OS: Linux scream 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux 
Processor: Intel(R) Xeon(R) CPU E5430 @ 2.66GHz 
+0

Hmmm, 32 bits manquants? 0x7f? –

Répondre

12

Il n'est allé nulle part .. votre déclaration d'impression est erronée. Essayez ceci:

printf("i1 = 0x%lx\n", i1); 
+0

Duh! Merci beaucoup. –

2

D'abord, vous lancez le pointeur vers un entier signé - c'est faux - les pointeurs ne sont pas signés. Ensuite, vous imprimez la valeur 64 bits avec le modificateur de format %x - qui attend une valeur 32 bits sur la pile. Essayez de compiler avec -Wall -pedantic et laissez gcc se plaindre.

Questions connexes