c언어 -(자료형)

2022. 3. 15. 16:11C언어

728x90

1. 정수형(integer)

 

정수(integer)란 부호는 있지만, 소수점 이하를 표현하지 못하는 수이다. 

12.23, 0.1 이런 값은 소수점 이하가 있으므로 정수가 아니다. 정수의 더 이상의 정수의 정의는 

중학교 수준에서 설명이 됨으로 더 이상 다루지 않을 것이다. 우리가 아는 정수랑 컴퓨터가 아는 정수가 다른 점이 있다면, 컴퓨터의 메모리는 유한하기 때문에 수학적 정의와 같은 무한대의 범위를 지원하지 않는 정도만 다르다.  

 

int i;

 

   키워드 int다음에 원하는 변수 이름 그리고 세미콜론으로 구성되어 있다.  컴파일러는 이 선언문을 만났을 때 정수 값을

저장할만한 4바이트 공간을 할당하고 이 공간에 대해 i라는 이름을 붙여줄 것이다. 이후 i라는 변수명을 통해 이 메모리에 정수 값을 저장할 수 있고 또 값을 읽을 수도 있다.  정수형의 최대 표현 가능한 값의 크기와 부호의 존재 유무에 따라 여러 가지 종류로 나눠진다. 

 

  먼저 변수의 크기와 표현 가짓수의 관계에 대해 알아보면, 값 하나를 표현하기 위해 몇 비트를 사용할 것인가에 따라

표현 가능한 수의 개수가 달라진다. 예를 들어 1비트로만 구성된 정수형이 있다면, 이 정수는 0과 1의 두 가지 상태밖에 기억하지 못한다. 이런 비트가 두게 오면 00, 01, 10, 11 네 가지 각각 다른 상태를 표현할 수 있다. 

비트가 세 개가 모인다면 2^3 승개 즉 8개의 수를 표현할 수 있다. 

 

 같은 원리로 비트가 4개 모이면 16가지의 상태를 표현할 수 있을 것이다. 일반적으로 n개의 비트가 모이면 2^n 가지의 수를 표현하는 것이 가능하며, 0부터 시작하므로 최대 표현 가능 수는 2^n-1이 된다. 

8비트로 구성되는 1바이트는 총 256(0~255) 가지의 종류의 수를 표현할 수 있고, 표현 가능한 최대 수는 255가 된다. 

 

int가 표현할 수 있는 데이터의 용량은 4바이트이다. (1byte==8bit)

컴퓨터는 0과 1밖에 모르기 때문에 우리는 8bit로 컴퓨터에게 얼마의 데이터 크기로 얼마를

표현할 것인지 알려주는 것이다. 

1bit에 0과 1을 사용할 수 있으므로 0과 1을 표현할 수 있다.

int는 부호가 있는 4바이트짜리 자료형이므로 +-2의 16승까지 표현할 수 있다.

 

 다음은 부호 여부에 따른 표현 번위 차이를 보자, 부호가 있는 정수(signed)는 제일 왼쪽 비트(MSB)를 부호 비트로 사용하며, 이 비트가 0이면 양수 1이면 음수가 된다. 이 이야기를 하는 것은 MSB를 부호 비트로 사용하면 값을 기억하는 비트가 줄어들게 되므로 표현할 수 있는 최댓값은 절반으로 줄어든 대신 음의 값을 표현할 수 있다. 값의 범위가 음수 영역으로 평행 이동하는 것이다. 

*MSB는 최상위 비트라고도 하고 left-most-bit라고도 한다. 

타입 크기(바이트) 부호 범위
int 4 있음 -2147483648~2147483647
short int 2 있음 -32768~32767
long int 4 있음 -2147483648~2147483647
unsigned int 4 없다 0~4294967295
unsigned short int 2 없다 0~65535

여기서 질문! int랑 long int랑 같은 거 같은데 차이가 뭔가요? 

나도 몰라 구글링해 

int = cpu의 레지스터와 동일한 크기를 가지는 타입 

long = 그런 거 모르겠고 무조건 4바이트

==int가 cpu를 가장 효율적으로 다룰 수 있음 

*레지스터 :  cpu내의 임시 기억 장소이며 레지스터의 크기에 따라 cpu의 비트수를 정의함

 

  위 도표를 보면 각 타입별로 할당된 바이트 수와 부호 여부가 다른데 이 크기와 부호 여부에 따라 표현 가능한 수의 범위가 달라진다. 4바이트 크기의 unsigned int는 최대 42억이라는 큰 값을 기억할 수 있는데 2바이트 크기의 unsigned short int는 65535까지만 기억할 수 있다. int형은 부호가 있고 4바이트의 크기를 가지므로 -2^31~2^31-1까지의 범위를 가지는데 비해 unsigned형은 같은 4바이트지만 부호가 없기 때문에 음수를 표현할 수 없는 대신 0~2^32-1까지 표현이 가능하다. 

 

++

 부호에 대한 수식어가 생략되면 signed가 적용되어 부호가 있는 것으로 선언된다.

signed == int, signed short int == short int 그렇기 때문에 int는 실제로 signed int이고 signed는 쓰지 않고 간략하게 쓰는 것이다. 

 

그냥 가장 큰거쓰면 오버 플로우도 안 뜨고 최고네? 

 

  똑같은 정수형에 대해서도 다양한 타입이 준비되어 있는데 이는 상황에 따라 가장 적절한 타입을 선택해서 쓸 수 있도록 하기 위해서다.   ==> 메모리를 최대한 아끼자.

년도나 온도 같이 값이 일정 이상 커지지 않는 것은 short를 쓰는 것이 메모리를 절약하는데 도움이 된다. 

==> 메모리 == 돈 

 

728x90