2009-06-19 2 views
1

Может ли кто-нибудь объяснить следующее странное поведение?Наиболее значимые 32 бита, потерянные при указании на int64_t

я запускаю следующую программу на 64-битной платформе Intel:

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; 
} 

Эта программа производит следующий вывод:

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

Может кто-нибудь объяснить, почему i1 содержит только младшие 32 бита от ptr? (Заметим, что отсутствует 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

Хммм, 32 бит отсутствуют? 0x7F? –

ответ

12

Это никуда не исчезло .. ваше заявление о печати неверно. Попробуйте это:

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

Duh! Огромное спасибо. –

2

Во-первых, вы бросаете указатель на знаковое целое число - это неправильно - указатели без знака. Затем вы печатаете 64-битное значение с помощью модификатора формата %x, который ожидает 32-битное значение в стеке. Попробуйте компилировать с -Wall -pedantic и пусть gcc жалуются.