C++에는 int, char, double 등 다양한 데이터 타입이 존재합니다. 이 글에서는 sizeof 연산자를 활용해 각 데이터 타입의 크기를 구하고, 이를 바탕으로 표현 가능한 값의 범위(최솟값과 최댓값)를 프로그래밍 방식으로 계산하는 방법을 살펴보겠습니다.
범위 계산 원리
sizeof 연산자를 사용하면 데이터 타입의 크기를 바이트(byte) 단위로 얻을 수 있습니다. 여기에 8을 곱하면 비트(bit) 단위 크기로 변환됩니다.
비트 수가 n이라고 할 때, 표현 범위는 다음과 같이 결정됩니다.
- 부호 있는(signed) 타입: 최솟값은 -2^(n-1), 최댓값은 2^(n-1) - 1
- 부호 없는(unsigned) 타입: 음수가 존재하지 않으므로 범위는 0부터 2^n - 1까지
예제 코드
#include <iostream>
#include <cmath>
#define SIZE(x) sizeof(x) * 8 // 비트 단위 크기 계산
using namespace std;
void getRange(string type, int n) {
if(type.compare("SIGNED") == 0) { // 부호 있는 숫자의 하한과 상한 계산
int min = pow(2, n - 1);
int max = pow(2, n - 1) - 1;
cout << "Range from " << (-1) * min << " to " << max << endl;
} else { // 부호 없는 숫자는 0부터 시작
int range = pow(2, n) - 1;
cout << "Range from 0 to " << range << endl;
}
}
int main() {
cout << "For Signed int: ";
getRange("SIGNED", SIZE(int));
cout << "For Signed float: ";
getRange("SIGNED", SIZE(float));
cout << "For Unsigned int: ";
getRange("UNSIGNED", SIZE(unsigned int));
cout << "For Unsigned short: ";
getRange("UNSIGNED", SIZE(unsigned short int));
cout << "For Signed char: ";
getRange("SIGNED", SIZE(char));
}실행 결과
For Signed int: Range from -2147483648 to 2147483647 For Signed float: Range from -2147483648 to 2147483647 For Unsigned int: Range from 0 to -2147483648 For Unsigned short: Range from 0 to 65535 For Signed char: Range from -128 to 127
참고 사항
출력 결과에서 몇 가지 주목할 점이 있습니다.
- float의 경우:
float는 IEEE 754 부동소수점 방식으로 값을 저장하기 때문에, 위와 같은 단순 비트 기반 정수 범위 공식이 실제 표현 범위와 일치하지 않습니다. 출력된 값은 어디까지나 32비트 정수 기준의 계산 결과입니다. - unsigned int의 경우: 계산 결과인 2^32 - 1(약 42억)이
int변수가 담을 수 있는 최댓값(2,147,483,647)을 초과하기 때문에 오버플로우가 발생하여 음수인 -2147483648이 출력되었습니다. 정확한 결과를 얻으려면 결과를 저장하는 변수를unsigned long long등 더 큰 타입으로 선언해야 합니다.
이처럼 sizeof와 간단한 수학 공식만으로도 데이터 타입의 메모리 크기와 표현 범위를 손쉽게 확인할 수 있습니다. 다만 자료형의 내부 표현 방식(정수형/부동소수점형)과 오버플로우 가능성을 항상 염두에 두어야 합니다.