2011-08-25 6 views
6

64 비트 Linux에서 C++을 사용하고 있으며 컴파일러 (g ++)도 64 비트입니다. 어떤 변수의 주소, 예를 들어 정수를 출력 할 때 64 비트 정수를 출력하지만 실제로는 48 비트 정수를 인쇄합니다.64 비트 컴퓨터에서 C++ 포인터

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

어디서 다른 2 바이트가 궁금합니다. 당신을 고대합니다.

감사합니다.

+0

수는'얼마나 많은 비트가 1'는 무엇입니까? 'uint32_t x = 1;'에 비트가 충분하지 않다고 불평하겠습니까? 사물을 출력하기보다는'sizeof (* int)'를 체크해야한다. –

답변

7

대부분의 C++ 구현에서 주소를 인쇄하면 선행 0이 표시되지 않으므로 내용을 더 쉽게 읽을 수 있습니다. 0x00000000000013fd과 같은 항목은 실제로 가치를 추가하지 않습니다.

사용자 공간에서 48 비트 값 이상을 볼 수없는 이유는 현재 AMD64 아키텍처가 48 비트의 가상 주소 공간을 갖기 위해 정의 되었기 때문입니다 (예 : 리눅스에서 cat /proc/cpuinfo으로 볼 수 있음)

재미에 대한
+0

이 위키 백과 (예, 알고 있습니다) 기사에 따르면 아키텍처 정의에서 최대 64 비트까지 허용하지만 현재 구현에서는 48 개만 사용할 수 있습니다. http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ "64 비트"아키텍처이고 명목상 포인터는 64 비트입니다. 그것은 현재 256TB 가상 주소 공간이 충분하다는 것입니다. 모든 포인터의 상위 16 비트가 0이라고 가정 할 수 있다면 전선 (따라서 전력)을 절약 할 수 있습니다. – Voo

3

그들은 거기에 있습니다. 아무데도 가지 않았으므로 스트림에 서식이 설정되어 있습니다. 선행 0을 건너 뜁니다 (스트림의 채우기 및 너비 속성 확인).

EDIT : 두 번째 생각으로는 포인터의 기본값 인 operator<<의 서식을 변경하는 좋은 방법이 없다고 생각합니다. 채우기 및 너비 특성은 std::hex 조작자를 사용하여 스트리밍하는 경우 변경할 수 있습니다.

+0

그래서 어떤 객체의 주소가 0x400c10이라면 5 바이트의 선행 0이 생략된다는 것을 의미합니다. 맞습니까? – cheng

+1

@ user508305 모든 포인터가 반드시 플랫폼 주소 지정 기능과 동일한 크기 일 필요는 없습니다. –

+0

어떤 경우 서로 다른 크기입니까? 당신은 이것에 대해 더 많이 이야기 할 수 있습니까? 아니면 그냥 키워드를 줄 수 있습니까? – cheng

1

당신은 C 출력을 사용하고 더 당신이 후에 무엇을하는 것처럼 있는지 볼 수 있습니다 :

printf("0x%p"); 
관련 문제