여러분 안녕하세요. 세이버입니다.
이번 강에서는 저번 강에서 배운 자료형 중 정수형에 대해 소개해드리도록 하겠습니다.
자료형에 대한 개념이 부족하신 분들은 저번 강을 보고 오시면 도움이 되실 겁니다.
세이버의 C언어 강의 16강_ 자료형이란 무엇인가 : https://poci.tistory.com/23
1. 정수형이란 무엇인가
정수형은 자료형의 형태 중 하나로 char, short, int, long이 있습니다.
정수의 사전적 정의는 아래와 같이 음의 정수, 0, 양의 정수를 통칭하는 것입니다.
즉, 우리가 일상에서 흔히 사용하는 숫자들이 정수입니다.
따라서 정수형은 정수인 수(음수, 0, 양수)를 처리하는 자료형입니다.
2. 정수형의 크기와 표현 범위
자료형들의 크기는 저번 강에서 소개해드렸습니다.
다시 표로 정리하면 다음과 같습니다.
char | 1바이트 |
short | 2바이트 |
int | 4바이트 |
long | 4바이트 |
자료형 크기를 알면 표현 범위를 계산할 수 있습니다.
표현 범위의 계산식
이 식은 외우셔도 되지만 모르셔도 크게 문제없습니다.
계산식으로 자료형의 표현 범위를 계산하면 다음과 같습니다.
char | -128 ~ +127 |
short | -32768 ~ +32767 |
int | -2147483648 ~ +2147483647 |
long | -2147483648 ~ +2147483647 |
궁금증이 많으신 분들은 이 표를 보시고 의문이 생길 것입니다.
위의 표현 범위를 넘어서는 수를 처리하는 프로그램을 만들일은 거의 없겠지만,
꼭 그런 프로그램을 만드는 일이 없으라는 보장도 없습니다.
그러면 표현범위를 넘은 수를 처리하려면 어떻게 해야 할까요?
이걸 설명드리기 전에 수의 표현이 어떻게 이루어지는지 먼저 설명드리겠습니다.
컴퓨터는 0과 1로만 이루어진 2진수를 사용하고, 하나의 비트에 0이나 1이 들어가서 수를 표현하죠.
1바이트(8비트)의 크기를 가진 char를 예로 들면 char에는 8개의 비트가 있습니다.
그럼 8개의 비트를 모두 수를 표현하는 데에 사용하냐??
그건 아닙니다.
양수뿐 아니라 음수도 표현을 해야 하기 때문에 8개의 비트를 모두 수로 표현하면 음수를 표현할 수 없습니다.
또한 컴퓨터는 사람과 같이 +, -의 개념이 없기 때문에 스스로 양수인지 음수인지 판별할 수도 없습니다.
그래서 사용하는 방법이 부호 하나를 부호 비트라 지정하고 0이면 양수, 1이면 음수라고 구분시키는 것입니다.
때문에 char은 8개의 비트가 있지만 이 중 1개는 부호 비트로 사용하고 나머지 7개만 수를 표현하는 데 사용합니다.
표현 범위 계산식에서
n이 아니라 n-1을 지수로 쓴 이유가 비트 하나를 부호 비트로 사용하기 때문입니다.
다시 본론으로 돌아와서 그러면 표현 범위를 어떻게 넓힐 수 있을까요?
부호 비트를 숫자를 표현하는 데에 사용하면 됩니다.
대신 음수를 표현할 수는 없지만, 양수의 표현 범위가 2배 넓어지게 됩니다.
이럴 때 사용되는 자료형의 특수기호가 unsigned입니다.
unsigned는 '서명이 없는'이라는 뜻으로 C언어에서는 부호가 없다는 뜻입니다.
즉, 부호 없이 양수만 표현한다는 의미입니다.
우리가 흔히 자료형을 선언할 때
int a;
이렇게 선언하는데 이는 int 앞에 signed가 생략된 것입니다.
그렇기에 int a;라고 선언해도 a에는 음수, 양수 모두 담을 수 있는 것이죠.
signed를 생략하는 이유는 대부분 정수형 변수는 음수, 양수를 모두 담기 위한 목적으로 선언되므로
변수 하나하나에 signed를 넣기 번거로우므로 생략하는 것입니다.
그러면 unsigned를 붙이면 어떻게 될까요?
unsigned int a;
이렇게 선언하시면 a에 음수는 담을 수 없지만 int의 양수 범위 2배인 4,294,967,295까지 표현할 수 있습니다.
실습으로 넘어가겠습니다.
a는 일반적인 char형이고, b는 unsigned가 붙은 char형입니다.
a와 b 모두 150을 대입한 후 출력을 해보니 a에는 -106이, b는 150이 출력되었습니다.
char의 최대 표현 범위인 127을 넘어서서 a에 오버플로우가 발생해서 이런 결과가 나온 겁니다.
b는 unsigned를 붙여 양수 표현 범위가 넓어졌기에 150이 그대로 출력된 겁니다.
오버플로우에 대해서는 다음절에서 설명드리겠습니다.
3. 오버플로우란 무엇인가
오버플로우(overflow)란 '넘쳐흐르다'라는 뜻으로 메모리 공간이 부족하여 값이 넘치는 현상 중 하나로
최대 표현범위보다 높은 값을 입력받은 경우 발생하는 현상입니다.
반대의 개념인 언더플로우(underflow)는 최소 표현범위보다 낮은 값을 입력받은 경우 발생하는 현상입니다.
오버플로우와 언더플로우의 특징은 순환성으로 값이 순환되어 표현한다는 겁니다.
표현 범위를 최소에서 최대까지 쭉 나열한다고 가정해봅시다.
정수형 중 표현 범위가 가장 좁은 char형으로 예를 들겠습니다.
-128 | -127 | -126 | .... | +125 | +126 | +127 |
이렇게 char의 표현 범위를 나열했습니다.
이제 char에 최대 표현 범위인 127보다 높은 수를 대입한다면 127 다음의 수는 -128부터 시작하게 됩니다.
말로 하니까 조금 어려운데... 쉽게 그림으로 설명하겠습니다.
우선 오버플로우가 발생되면 머릿속으로 표현 범위 두 개가 이어졌다고 상상해보세요.
이런 상태에서 char형에 130을 대입한다고 가정해보겠습니다.
최대 표현 범위인 127보다 큰 수를 대입하므로 오버플로우가 발생하게 됩니다.
표현범위 1에서 표현 범위 2로 넘어가게 됩니다.
그러면 위 그림과 같이 다음 표현 범위의 최솟값부터 차례대로 올라가게 됩니다.
이런 식으로 char형에 130을 대입하면 실질적으로 -126이 저장되게 됩니다.
언더플로우도 이와 비슷합니다.
언더플로우가 발생했을 때 역시 표현 범위 두 개를 겹쳐져 있다고 생각하시면 편합니다.
언더플로우는 값이 표현 범위의 최솟값보다 낮아서 발생하는 현상입니다.
따라서 다음 표현범위의 최댓값부터 차례로 내려오면 됩니다.
예시로 char형에 -130을 대입한다고 하면
이런 식으로 언더플로우가 진행되기에 실질적으로 126이 대입됩니다.
4. TIP
정수형 자료형에 대한 몇 가지 팁을 알려드리겠습니다.
1. char는 문자형에 주로 사용한다.
char는 정수형이지만 문자형으로 구분되기에 영어나 한글과 같은 문자를 처리하는 데 사용됩니다.
이유는 아스키코드(ASCII Code) 때문입니다.
간단하게 설명드리자면 컴퓨터는 0과 1로만 모든 걸 처리하기에 문자 역시 0과 1로만 처리합니다.
문자를 어떻게 0과 1로 처리하느냐? 문자를 하나하나 숫자로 치환하면 가능합니다.
그리고 그 치환된 결과가 아스키코드입니다.
즉, 컴퓨터에서의 문자는 일종의 숫자라고 볼 수 있기에 char가 정수형에 포함된 것입니다.
2. 정수형은 int를 주로 사용한다.
제가 지금까지 실습으로 정수형을 다룰 때는 항상 int형을 사용했습니다.
아마 책으로 C언어를 배우시는 분들은 책을 보시면 거의 모든 실습 예제가 정수형은 int로 처리하도록 되어있을 겁니다.
그 이유는 CPU가 가장 빠르게 처리할 수 있는 정수형이 int이기 때문입니다.
이유를 설명드리자면 CPU가 연산하는 기본 단위가 32비트로 이는 int의 메모리 크기와 동일하기 때문입니다.
이번 강의는 여기까지입니다.
다음 강에서는 또 다른 자료형인 실수형에 대해 다뤄보도록 하겠습니다.
오늘도 수고하셨습니다.
정리
- 정수형 : 정수(음수, 0, 양수)를 처리하는 자료형
- 표현 범위를 늘리는 방법 : 변수 선언부의 자료형 앞에 unsigned를 기입 (단, 음수는 불가)
- 오버플로우 : 최대 표현 범위보다 큰 값을 대입하면 발생하는 현상
- 언더플로우 : 최소 표현 범위보다 작은 값을 대입하면 발생하는 현상
- char는 문자형으로 문자(영어, 한글)를 처리한다.
- CPU에서 int형의 연산이 제일 빠르므로 정수형을 사용할 때는 가급적 int형을 사용한다.
강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.
궁금하신 점이나 질문은 댓글이나 메일을 남겨주세요.
'C언어' 카테고리의 다른 글
세이버의 C언어 강의 19강_ 자료형이란 무엇인가 Part4_형변환 (0) | 2019.04.29 |
---|---|
세이버의 C언어 강의 18강_ 자료형이란 무엇인가 Part3_실수형 (0) | 2019.04.21 |
세이버의 C언어 강의 16강_ 자료형이란 무엇인가 (0) | 2019.04.12 |
세이버의 C언어 강의 15강_반목문이란 무엇인가 Part 3 (do while 함수와 break+continue) (0) | 2019.03.16 |
세이버의 C언어 강의 14강_반목문이란 무엇인가 Part 2 (while 함수) (0) | 2019.03.12 |