2009-06-19 3 views
1

다음과 같은 이상한 동작을 설명 할 수 있습니까?int64_t 포인터를 캐스팅 할 때 가장 중요한 32 비트가 손실됩니다.

I 64 비트 인텔 플랫폼에서 다음 프로그램 실행 : I1은 최하위 32 비트를 포함하는 이유

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

사람이 설명 할 수 :

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? (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

먼저 포인터를 부호있는 정수로 캐스팅합니다. 잘못된 포인터입니다. 포인터는 부호가 없습니다. 그러면 %x 형식 수정자를 사용하여 64 비트 값을 인쇄합니다. 스택에 32 비트 값이 필요합니다. -Wall -pedantic으로 컴파일을 시도하고 gcc을 불평하도록하십시오.

관련 문제