2007. 3. 16. 13:25

정수 변수 -> int, unsigned int, short, unsigned short, long, unsigned long
실수 변수 -> float, double
문자 변수 -> char, unsigned char
문자열 변수 -> char(문자 변수와 표현형은 똑같다.)


sizeof()란 상수, 변수, 자료형의 byte 수를 알고자 할 때 사용하는 예약어이다.
크기를 생각해서 프로그래밍을할 때 사용하는 예약어이다.

sizeof(대상체);

숫자를 표현함에 있어서도 바이트 수를 다르게 할 수 있다.

12 -> 2Byte
12L -> 4Byte
12.4 -> 8Byte
12.4F -> 4Byte

이렇게 똑같은 숫자이지만 크기를 정하여 표현할 수도 있다.

sizeof('A'); 1바이트
sizeof("김"); 3바이트
sizeof("A"); 2바이트
sizeof('한');
sizeof('★');
sizeof('ㅁ');4바이트

sizeof 연산자는 피연산자의 크기를 계산하여 바이트 단위로 결과가 나오게 된다.
'A'는 char 타입으로, 대부분의 시스템에서는 1바이트가 나온다.

 
sizeof("김");은 char a[] = "김";과 같은 의미이다.
sizeof(a);는 3이다.
이때, a는 "김"이라는 문자열에서 널문자까지 포함하는 크기를 가지는 char 타입의 배열이 된다.

즉, 개수가 3개인 배열이 되는 것이다.그래서 sizeof(a)는 배열 a의 크기인 3이 나온다.

"A"는 널문자 포함 2개의 공간을 차지하므로 char 타입 2개의 배열이 생성되어 sizeof("A")는 결과로 2가 나온다.

'한'과 같은 것은 사실 잘못된 표현이다. 컴파일러는 '한'을 'AB'와 같은 의미로 해석한다. 이는 영문자는 한 글자에 1byte인데 비하여, 한글이나 특수 문자는 한글자에 2byte를 차지하기 때문이다.

작은 따옴표는 문자형 상수를 나타내는 기호로써, 작은 따옴표 안에는 하나의 문자만 포함해야 하는데, 두 개의 문자를 포함하는 것이 되어, 컴파일러는 억지로 작은 따옴표 안의 내용을 메모리에 자리잡게 하고 그 주소를 가져온다.

이때 sizeof('한')이라고 한다면 '한'이라는 글자가 저장되어 있는 주소의 크기가 되며, 이는 포인터 타입의 크기와 같다.

현재 대부분의 시스템에서 포인터는 4byte의 크기를 갖고 있다. 컴파일러에게 sizeof('한')은 sizeof('AA')와 같은 의미로 해석되며, 그 결과는 해당 문자들을 메모리에 자리잡게 한 후 자리잡은 위치를 가리키는 포인터의 크기이다.결론적으로, '한'과 같은 문자 상수 표현은 잘못된 것이다.

R/E/F/E/R/E/N/C/E/

---------------------------------------------------------------------------

Data Types (16-bit)

---------------------------------------------------------------------------

Type Length Range

---------------------------------------------------------------------------

unsigned char 8 bits(1)         0 to 255

char 8 bits(1)                     -128 to 127

enum 16 bits(2)                  -32,768 to 32,767

unsigned int 16 bits(2)          0 to 65,535

short int 16 bits(2)               -32,768 to 32,767

int 16 bits(2)                      -32,768 to 32,767

unsigned long 32 bits(4)       0 to

long 32 bits(4)                    -2,147,483,648 to 2,147,483,647

float 32 bits(4)                    3.4 x 10-38 to 3.4 x 10+38

double 64 bits(8)                 1.7 x 10-308 to 1.7 x 10+308

long double 80 bits(10)         3.4 x 10-4932 to 1.1 x 10+4932

near(pointer) 16 bits(2)         not applicable

far (pointer) 32 bits(4)         not applicable

---------------------------------------------------------------------------

Data Types (32-bit)

---------------------------------------------------------------------------

Type Length Range

---------------------------------------------------------------------------

unsigned char 8 bits(1)            0 to 255

char 8 bits(1)                        -128 to 127

short int 16 bits(2)                 -32,768 to 32,767

unsigned int 32 bits(2)             0 to 4,294,967,295

int 32 bits(2)                         -2,147,483,648 to 2,147,483,647

unsigned long 32 bits(2)           0 to 4,294,967,295

enum 16 bits(4)                     -2,147,483,648 to 2,147,483,647

long 32 bits(4)                      -2,147,483,648 to 2,147,483,647

float 32 bits(4)                       3.4 x 10-38 to 3.4 x 10+38

double 64 bits(8)                    1.7 x 10-308 to 1.7 x 10+308

long double 80 bits(10)            3.4 x 10-4932 to 1.1 x 10+4932

near(pointer) 32 bits(2)             not applicable

far (pointer) 32 bits(4)              not applicable

---------------------------------------------------------------------------

'STUDY > C 언어' 카테고리의 다른 글

연산자 2  (0) 2007.03.17
연산자 1  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
명령어 이해 - for 문  (0) 2007.03.07
명령어 이해 - #ifdef / #ifndef / #endif  (0) 2007.03.02
Posted by Paul Hwang