C언어 / C++ 정수 자료형 특징 정리 예제
안녕하세요. 이번 시간에는 C언어 및 C++에서 사용되는 정수 자료형 종류인
char, short, int, long, long long의 특징과 차이를 예제를 통하여 알아보고,
unsigned 자료형에 대해서도 다루어보도록 하겠습니다.
정수 자료형 크기, 범위 비교
가장 대표적인 char, short, int, long 및 long long의 자료형 크기 및 범위는
아래와 같이 요약이 가능합니다.
char : 1 바이트, -128 ~ 127
short : 2 바이트, -32,768 ~ 32,767
int / long : 4 바이트, -2,147,483,648 ~ 2,147,483,647
long long : 8 바이트, -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
여기서 1 바이트는 0 혹은 1로 구성된 비트 8개로 구성된 단위를 의미하고,
따라서, int 자료형의 경우에는 4 바이트이므로 32개의 0/1로 표현이 됩니다.
자료형 종류가 다양하게 존재하는 이유
정수를 표현할 수 있는 자료형의 종류가 다양한 이유는 공간 이용의 효율을 높이기 위함입니다.
만일, a라는 변수에 저장되는 값이 무조건 0~100 사이라면 char 자료형만 사용해도 충분하므로,
int, long long 등의 자료형을 사용한다면 공간 낭비가 발생할 것입니다.
unsigned 정수 자료형
만일, 음수를 저장할 필요가 없는 경우에는 같은 공간으로 2배의 범위를 저장할 수 있는
unsigned 정수 자료형의 사용을 고려해볼 수 있습니다.
각 정수 자료형 종류에 대해서 unsigned 타입으로 선언할 경우 표현 범위가 아래처럼 변합니다.
unsigned char : 0 ~ 255
unsigned short : 0 ~ 65,635
unsigned int / unsigned long : 0 ~ 4,294,967,295
unsigned long long : 0 ~ 18,446,744,073,709,551,615
unsigned 자료형의 원리는 가장 앞의 부호 비트(1비트)를
부호 대신 범위를 표현하는데 사용하는 원리입니다.
참고로, 기존 signed 방식(정수 자료형 기본 형태)에서는 가장 앞의 1비트가 0이면 양수,
1이면 음수를 표현하며, 음수인 경우 범위 내 0으로 표현된 부분의 숫자를 카운팅합니다.
양수 예시 : 00000111 : 7 (4 + 2 + 1)
음수 예시 : 11111001 : -6 (-, 4 + 2)
정수 자료형 선언 C언어 코드 예제
실제 C언어 코드 내에서 정수 자료형이 선언되고 출력되는 예시를 살펴보겠습니다.
먼저, signed 정수 자료형에 관한 예시 코드입니다.
#include <stdio.h>
int main(){
char a = 100;
short b = -10000;
int c = 100000000;
long d = 100000000;
long long e = -100000000000;
// 출력 예시
printf("%d, %d\n", a, b);
printf("%d, %ld, %lld\n", c, d, e);
}
단, 해당 자료형이 표현할 수 있는 범위를 넘어가는 숫자를 할당하려고 시도한 경우
원하지 않는 값이 할당될 수 있으므로 주의해야 합니다.
출력시, char, short, int 자료형은 %d 형태로 포맷팅해야하며,
long 자료형은 %ld 형태로, long long 자료형은 %lld 형태로 포맷팅해야합니다.
char 자료형은 %c로 포맷팅한 경우 해당 숫자에 매칭되는 아스키 코드의 문자가 출력됩니다.
이번에는 unsigned 정수 자료형에 관한 예시 코드입니다.
unsigned int f = 4294967295;
unsigned long g = 4294967295;
unsigned long long h = 18446744073709551615;
printf("%u, %lu, %llu\n", f, g, h);
역시 범위 초과에 주의하며, 음수가 할당되지 않도록 유의해주셔야 합니다.
출력 시에는 %d 대신 %u의 형태로 포맷팅해주시면 되며,
long 및 long long 자료형에서도 %lu, %llu 형태 포맷팅을 사용하시면 됩니다.
정수 자료형 형변환 기준
서로 다른 두 정수 자료형이 연산에서 만난 경우에는
더 범위가 큰 자료형으로 통일되어 계산됩니다.
또한, signed와 unsigned 자료형이 만난 경우에는 unsigned 자료형으로 통일됩니다.
실수 자료형과 만난 경우에는 실수 자료형으로 통일되어 계산됩니다.
#include <stdio.h>
int main(){
short a = 1;
long b = 2;
unsigned long c = 3;
double d = 4.0;
a + b // short + long -> long 타입
b + c // long + unsigned long -> unsigned long 타입
b + d // long + double -> double 타입
}
실수 자료형에 관해 정리한 내용이 궁금하시다면 아래 링크의 이전글을 참고해주세요.
여기까지 C언어 및 C++에서 사용되는 정수 자료형에 관한 글을 마치겠습니다. 감사합니다.
'C & C++' 카테고리의 다른 글
[C언어] 문자열 선언 방법 정리(배열, 포인터) (0) | 2022.04.05 |
---|---|
C언어 포인터를 input으로 받는 함수 선언 (pass by pointer) : swap 함수 예제 비교 (0) | 2021.12.20 |
C언어 구조체 struct 없이 선언 : typedef (0) | 2021.12.17 |