http://sckllo7.tistory.com/entry/32bit%EC%99%80-64bit%EC%9D%98-C-%EC%9E%90%EB%A3%8C%ED%98%95Data-Type-%ED%81%AC%EA%B8%B0-%EC%B0%A8%EC%9D%B4


 우리가 보통 학교나 책에서 배우는 C의 자료형 크기는 다음과 같을 것 입니다.


 

char 

short 

int 

long 

float 

double 

크기

1byte 

2byte 

4byte 

4byte 

4byte 

8byte 

 자료형태

문자 

정수 

정수 

정수 

실수 

실수 


 이는 현재 대중화되어 있는 32bit 기준으로 되어 있습니다.

  ※ 옛날에 16bit 컴퓨터는 int형이 2byte, short형은 1byte, long형은 4byte였다고 합니다.

그리고 요즘에는 64bit 컴퓨터가 출시 되고 있으며, 이 64bit 컴퓨터에서는 int형이 8byte라는 의견이 지배적 입니다.


과연 그럴까요?


결론 부터 말하자면 아닙니다.


일단 우리가 알고있는 32bit 컴퓨터의 경우를 먼저 보면 다음과 같습니다.



 위에서는 앞서 설명한 표와 같이 우리가 평소에 알고있는 자료형의 크기가 출력되고, 포인터 변수 또한 4byte로 설정되어 있습니다.

 ※ 32bit 컴퓨터에서는 메모리 주소의 범위가 0 ~ 2^32 - 1에 해당하기 때문 입니다.


다음은 64bit 컴퓨터에서 출력시킨 화면 입니다.



 위의 캡쳐대로 해당 컴퓨터는 x86_64 프로세서를 사용합니다. 즉 64bit 체계의 운영체제이나 int size는 4bit로 나옵니다.

이러한 이유를 살펴보면 int형의 크기는 컴파일러에서 정하는거 같지만 실질적으로 크기를 정하는 것은 System Vendor의 몫이라고 합니다.

그러므로 Intel의 경우에는 Intel CPU에선 int형이 무조건 4byte라고 합니다.

보통 사람들은 int형이 16bit 에서는 2byte, 32bite 에서는 4byte를 가지고 있으니, 당연히 64bit 에서는 8byte의 크기를 가지고 있다고 아는 사람들이 많으나 64bit에서는 int형의 크기가 반드시 8byte여야 한다는 규약은 없다고 합니다.

또한 만일 64bit의 int형을 8byte로 설정 할 경우 32bit에서 64bit로 가면서 모든 프로그램을 수정해야 할 수 있기 때문이라고 합니다.

 그리고 포인터 변수와 같은 경우에는 자료형에 상관 없이 8byte로 할당 되어 있습니다.

 ※ 32bit 와 마찬가지로 64bit 컴퓨터에서는 메모리 주소의 범위가 0 ~ 2^64 - 1에 해당하기 때문 입니다.


 위의 실험들은 아래 소스를 만들어서 실행 하였으며, 의문이 생기시는 분들은 아래 소스를 가지고 확인 하셔도 됩니다.


#include<stdio.h>


int main()

{

printf ("\n-- General Data Type Size --\n");

printf ("char size : %d byte\n", (int)sizeof(char));

printf ("short size : %d byte\n", (int)sizeof(short));

printf ("int size : %d byte\n", (int)sizeof(int));

printf ("long size : %d byte\n", (int)sizeof(long));

printf ("double size : %d byte\n", (int)sizeof(double));

printf ("long double size : %d byte\n", (int)sizeof(long double));


printf ("\n-- Pointer Data Type Size -- \n");

printf ("char* size : %d byte\n", (int)sizeof(char*));

        printf ("short* size : %d byte\n", (int)sizeof(short*));

        printf ("int* size : %d byte\n", (int)sizeof(int*));

        printf ("long* size : %d byte\n", (int)sizeof(long*));

        printf ("double* size : %d byte\n", (int)sizeof(double*));

        printf ("long double* size : %d byte\n", (int)sizeof(long double*));


return 0;


 ※long double 형은 GCC 에서만 지원이 되는 형식이며, long double형의 포맷 지정자는 %Lf 입니다.