C언어에서는 다양한 형태의 자료형을 제공해주는데 여기서는 정수형의 자료형과 부호를 알아보자
정수 자료형은 키워드와 크기를 붙여서 정의를 할 수 있는데 키워드는 signed와 unsigend 크기는 short, long이다
여기서 signed는 부호가 있음 표현을 하기에 보통은 생략한다.
unsigned는 부호가 없음. 즉 0부터 시작을 표현한다.
아래의 표는 정수 자료형의 크기 및 범위를 나타낸 표다.
char signed char |
1바이트, 8비트 | -128~127 | |
unsigned char | 1바이트, 8비트 | 0~255 | |
short short int |
2바이트, 16비트 | -32,768~32,767 | int 생략 가능 |
unsigned short unsigned short int |
2바이트, 16비트 | 0~65,535 | int 생략 가능 |
int signed int |
4바이트, 32비트 | -2,147,483,648~ 2,147,483,647 | |
unsigned unsigned int |
4바이트, 32비트 | 0~4,294,967,295 | int 생략 가능 |
long long int signed long signed long int |
4바이트, 32비트 | -2,147,483,648~ 2,147,483,647 | int 생략 가능 |
unsigned long unsigned long int |
4바이트, 32비트 | 0~4,294,967,295 | int 생략 가능 |
long long long long int signed long long signed long long int |
8바이트, 64비트 | -9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 |
int 생략 가능 |
unsigned long long unsigned long long int |
8바이트, 64비트 | 0~18,446,744,073,709,551,615 | int 생략 가능 |
표 자료 출처:C 언어 코딩 도장: 7.0 정수 자료형 사용하기 (dojang.io)
위에 있는 자료형을 가지고 출력을 하였을 떼 사용되는 지정서식자는
char, short, int는 %d로 출력하고 long은 %ld , long long은 %lld 로 출력한다.
위에는 부호가 있는 자료형을 사용을 하였고, 이번에는 부호가 없는 자료형을 출력하는 방식을 알아보자.
unsigned char, unsigned short는 %u와 %d 둘다 출력할 수 있지만
unsigned int는 %u, unsigned long은 %lu, unsigned long long은 %llu 로 맞춰줘야 출력이 된다.
추가로 %u는 부호 없는 10진수를 뜻하는 unsigned decimal의 약어로 u를 쓰고
lu의 l은 long의 약어 llu는 long long의 축약형이다.
[오버플로우 언더플로우]
그러면 여기서 우리는 한 가지를 생각할 수 있는데 위에 표에 있는 범위를 넘는 값이 들어가면 어떻게 출력이 될까?
char 자료형으로 예시를 보이면 char는 -128~127까지이고 unsigned char는 255까지이다.
임의로 범위를 넘는 값을 할당하여 출력을 해보았다.
위와 같이 실제 출력 값은 각각 -128,0이 나왔다. 그 이유는 오버플로우(overflow)가 발생했기 때문인데 이럴 경우 각 자료형의 최솟값이 출력이 되는데 이를 응용하여 언더플로우(underflow)는 최솟값보다 작아진 경우인데 char 자료형에
-129를 할당하게 되면 127을 출력한다.
[자료형 크기 구하기]
먼저 자료형의 크기는 바이트 단위로 구하는데 여기서 쓰이는 연산자는 "sizeof" 이고, sizeof는 총 3가지 방식으로 쓸 수 있다.
1. sizeof 표현식
2. sizeof (자료형)
3. sizeof (표현식)
먼저 표현식은 변수, 상수, 배열등 프로그래머가 만들어낸 요소를 뜻합니다.
출력 값은 4로 나온다. 이유는 우리는 자료형의 크기를 구하기 위해 sizeof를 썼고 그에 맞는 값이 출력이 된 것이다. (int는 4바이트이다.)
하지만 sizeof int와 같은 형식으로는 크기를 구할 수 없다.
이러한 형식으로 크기를 구할 수 있으면
위와 같은 괄호를 이용하여 사용할 수도 있다.
여담으로 unsigned가 자료형에 붙어도 크기는 똑같다.
[자료형 최솟값, 최댓값 표현하기]
int 자료형의 최솟값은 -2147483648이지만 이 값을 직접 할당을 하면 오류가 난다.
오류가 나는 이유는 나는 이렇게 생각한다. visual studio에선 음수를 표기할 때 먼저 양수로 계산하고 최종적인 값을 출력할 땐 보수를 이용하여 음수를 표현하기 때문에 -2147483648를 양수로 계산을 하면 최댓값을 넘기기에 오류가 뜨는 것 같다.
그래서 이를 해결하기 위해선 #include <limits.h> 헤더 파일을 선언해준다.
선언을 해주면 아래와 같이 표현을 할 수 있게 된다.
더 나아가 limits.h 에 정의된 최솟값, 최댓값을 못 넘기거나 넘기면 언더플로우, 오버플로우가 발생한다.
여담으로 unsigned의 자료형의 최솟값은 모두 0이며 최댓값을 출력할 때 U를 붙이면 된다.
[크기가 표시된 정수 자료형 사용하기]
위에 쓰인 limits.h 는 기계 의존적인 자료형의 크기를 정의했다. 하지만 이번에 쓰이는 헤더 파일 stdint.h는 자신이 원하는 자료형의 크기를 선언할 수 있다.
limits.h 는 사용하는 프로그램마다 크기가 다르게 나타낼 수 있지만, stdint.h는 사용자 직접 정확하게 크기를 선언을 하고 사용할 수 있다는 점이다.
특히 char, short, int , long와 같은 자료형을 명확한 수치로 나타내 줄 수 있다. short는 항상 16비트가 아니며 더 나아가 int도 항상 32비트가 아니다 하지만 short는 항상 int 보다 작아야 한다고 정의를 하고 있기 때문에 sidint.h 헤더 파일을 이용하여 이를 명시적으로 정의를 해주는 것이며 이식성 부분에서도 유리하다.
그리고 stdint.h 헤더파일 안에 최소, 최댓값이 정의되어 있기에 따로 limits.h를 선언하지 않아도 된다.
'c언어' 카테고리의 다른 글
c언어. 문자 자료형 사용하기 (4) | 2021.07.15 |
---|---|
c언어. 실수 자료형 사용하기 (0) | 2021.07.15 |
C언어. 변수 만들기 (0) | 2021.07.07 |