본문 바로가기
프로그래밍/C

64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까?

by eteo 2022. 4. 14.

 

	char* p1;
	int* p2;
	double* p3;
    
	printf("%d\n", sizeof(p1));
	printf("%d\n", sizeof(p2));
	printf("%d\n", sizeof(p3));

 

분명 수업에서 들었을 때는 8바이트가 나올거라고 했는데

 

실제 위와같이 코드를 치고 실행해보니 4바이트 라고 나왔다..

 

열심히 검색해보니 이유는

 

내가 사용하는 Visual Studio에서 32비트 용으로 컴파일 하기 때문..

 

 

솔루션 플랫폼을 x86이 아니라 x64로 바꿔주면 8바이트라고 제대로 뜬다.

 

 

 

그리고 리눅스 64비트 환경에서도 gcc로 컴파일 하니 8바이트라고 떴다.

 

주소값도 16진수로 16자리나 된다.

 

 

결론은 내가 개발하고 있는 pc의 환경이 아니라 어느 플랫폼을 대상으로 컴파일하냐에 따라 포인터 크기가 달라질 수 있다..

 


추가로,

 

32비트 cpu라고 하면

 

cpu가 한번에 처리 가능한 데이터의 양=레지스터의 크기=워드 크기=데이터 버스 크기=어드레스 버스 크기

 

가 32비트라는 뜻이다.

 

32비트로 표현가능한 수는 0x00000000 부터 0xFFFFFFFF 까지 총 2^32 개.

 

32비트 cpu에선 4gb(2^2+2^30 byte) 이상의 램을 인식할 수 없는 이유도 바로 이것이다.. 레지스터가 이 이상의 주소값을 표현할 방법이 없다.

 

한편 64비트 cpu가 수용가능한 램은 이론상 16엑사바이트(2^4+2^60)인데 현실적으로 하드웨어의 한계가 있다고 한다.