본문 바로가기
Programming 개발은 구글로/C

[C] 자료형 (short int, int, long int )

by 40대직장인 2022. 4. 30.

C 자료형 (short int, int, long int )

 

int 자료형은 정수를 가지는 자료형으로서 초기에는 2바이트(16비트)의 자료형이었으나 현재는 4바이트(32비트)의 자료형이다.

 

int 자료형의 크기가 변하는 이유는 메모리 주소를 unsigned int 값으로 사용하고 있기 때문이다.

초기에는 메모리 크기가 64KB 이하였다. 16비트로서 64KB를 모두 가리킬 수 있었기 때문에 그 당시에는 int 형이 2바이트였지만 현재는 메모리 크기가 평균 2GB이다.

메모리는 계속해서 커지고 있으며, 32비트로 가리킬 수 있는 메모리의 한계는 4GB이다.

C언어에는 near와 far 포인터 개념이 있기 때문에 near 포인터로 4GB, far 포인터로 4GB를 가리켜 총 8GB 까지는 사용이 가능하다.

 

[[ int ]]

int는 현재는 4바이트이지만 C에서는 2바이트로 사용이 되었었다.

C에서의 int 는 C++ 의 short int와 동일하고, 현재의 4바이트 int 는 C 에서의 long int 와 동일하다.

 

[[ short int ]]

현재는 int 가 4바이트이기 때문에 유동 범위가 작을 때 4바이트를 사용하면 메모리의 낭비가 심하기 때문에 C++에서는 2바이트 자료형인 short int 가 추가되었다.

short int에서 int는 생략 가능하며, 그냥 short으로 사용할 수 있다.

 

short의 표현 범위는 0000 0000 0000 0000 ~ 1111 1111 1111 1111까지이며, 총 65536 가지의 값을 가질 수 있다.

 

signed short 은 최상위 비트를 부호로 사용하기 때문에 0000 0000 0000 0001 ~ 0111 1111 1111 1111 까지는 양수이고, 1000 0000 0000 0000 ~ 1111 1111 1111 1111 까지는 음수이다. 0000 0000 0000 0000 은 0(제로)이다.

가질 수 있는 정수의 범위는 -32768 ~ +32767이다.

 

unsigned short 은 0000 0000 0000 0001 ~ 1111 1111 1111 1111 까지를 모두 양수로 가지며, 그 범위는 0 ~ +65535이다.

 

[[ long int ]]

4바이트 자료형으로서 C++에서는 int와 동일하므로 long 보다는 int로 사용된다. long int에서 int는 생략 가능하다.

 

long의 표현 범위는 0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111 1111까지 총 4G의 값을 가진다.

 

signed long 은 최상위 비트를 부호로 사용한다. 가질 수 있는 정수의 범위는 -2147483648 ~ +2147483647이다.

 

unsigned long 은 음수를 가지지 않는 자료형으로 가질 수 있는 정수의 범위는 0 ~ 4294967295이다.

 

[[ 상수의 자료형 ]]

int a = 12345;

여기서 12345는 상수이다. 정수형 상수의 기본 자료형은 int 가 적용된다.

C에서는 int의 범위가 -32768 ~ +32767이므로 long a = 50000;  <== 이때 오류가 발생하게 된다. (C++에서는 50000 이 int의 범위에 들어가므로 전혀 상관이 없다.)

따라서 상수 50000을 long 형으로 설정을 해주어야 한다. 바로 50000L이다. 상수 끝에 L을 붙여주게 되면 그 상수는 long 형이 된다.

 

또한 float a = 1.234; 에서 1.234는 double 형이다. 따라서 double 형을 float 형에 대입하면 컴파일 시 Waring이 발생하게 되는데 (이 Waring이 발생하더라도 프로그램 실행에는 지장을 주지 않는다.) Waring을 없애려면 1.234를 float 형으로 캐스팅을 해주면 된다.

float a = (float) 1.234; 자료의 손실이 있더라도 float 형으로 변환하겠다는 의사가 분명히 담겨있기 때문에 Waring이 발생하지 않는다.

 

[[ 자료형의 크기를 확인하는 sizeof() 명령어 ]]

sizeof()는 함수가 아니다. 자료형의 크기를 확인하는 기본 명령어이다. for, while 등과 같은 C언어 기본 명령어인 것이다.

 

현재 int 형이 2바이트인지 4바이트인지를 확인하려면 printf ( "%d\n", sizeof ( int ) ); 를 실행해보면 된다.

 

#include <stdio.h>

void main()
{
  printf ( "%d %d %d %d\n", sizeof ( char ), sizeof ( int ), sizeof ( long ), sizeof ( double ) );
}

실행 결과가 1 2 4 8 이 나온다면 C 컴파일러이며, int 형의 크기는 2 바이트인 것이다.

실행 결과가 1 4 4 8 이 나온다면 C++ 컴파일러이며, int 형의 크기는 4 바이트인 것이다.

 

[[ int 형 자료의 메모리 저장 방식 ]]

어떤 자료이든 메모리에는 1바이트씩 저장된다. 16비트 int 형을 기준으로 할 때 2바이트이기 때문에 메모리에 저장될 때는 상위 8비트와 하위 8비트가 따로 저장이 되게 된다.

당연히 이어진 공간에 순차적으로 저장이 되는데 중요한 건 상위 8비트가 뒤에 저장이 된다는 것이다. 즉, 16진수로 1234h 가 있다면 이것은 메모리에는 34 12로 저장이 된다는 것이다.

 

별거 아닌 거 같지만 이건 매우 중요한 부분이다.

32비트 int 형의 경우는 4바이트이기 때문에 12345678 h 라면 78 56 34 12로 저장된다.

 

 

 

댓글