들어가면서
1.C++의 각각의 자료형은 각자만의 크기(byte)를 가지며 표현할 수 있는 수의 범위도 각자 다양하다.
2.int형 같은 경우 --2147483648 ~ 2147483647 까지의 수의 범위를 가지고 unsigned int형 같은 경우 0 ~ 4294967295까지의 수의 범위를 가진다.
3.이번 글에서는 int형과 double형을 예를 들면서 오버플로우와 언더플로우를 이해하겠다.
오버플로우(overflow)
1.오버플로우란?
:각 자료형이 가진 수의 범위를 벗어나게 되면 수를 표현할 수 없어 그 자료형의 최솟값부터 다시 시작하는 현상을 말한다.
2.예를 들면, int형은 --2147483648 ~ 2147483647 까지의 수의 범위를 갖고 있는데, 최댓값인 2147483647에서 더하기 1을 하면 2147483648이 되어 수를 표현할 수 없으므로 int 자료형의 최솟값인 - 2147483648부터 다시 시작하게 된다.
#include <iostream>
using namespace std;
int main(void)
{
int num = 2147483647;
num += 1; //num = -2147483648
cout << "num: " << num << endl;
num += 1; //num = -2147483647
cout << "num: " << num << endl;
return 0;
}
언더플로우(underflow)
1.언더플로우란?
:오버플로우와 반대로 해당 자료형의 최솟값보다 더 작아지면 해당 자료형의 최댓값으로 다시 시작하는 현상을 말한다.
#include <iostream>
using namespace std;
int main(void)
{
int num = -21474836478;
num -= 1; //num = 21474836477
cout << "num: " << num << endl;
num -= 1; //num = 21474836476
cout << "num: " << num << endl;
return 0;
}
-위 출력결과가 컴파일 환경에 따라 다를 수 있다. 다만, 중요한 것은 해당 자료형의 최솟값보다 작은 값이 되면 언더플로우가 발생한다는 점이다.
double형의 오버플로우와 언더플로우
1.double형의 오버플로우가 일어나면 inf(infinity)가 반환된다. 반면, 언더플로우가 발생하면 -inf(-infinity)가 반환된다.
2.이는, 부동소수점 표현에서 특정 수치로 표현할 수 있는 범위를 넘어서게 되면 발생하는 현상이다.
#include <iostream>
using namespace std;
int main(void)
{
double num1 = numeric_limits<double>::max();
double num2 = numeric_limits<double>::lowest();
cout << "double형의 최댓값: " << num1 << endl;
cout << "double형의 최솟값: " << num2 << endl;
num1 *= 1000.0; //inf
num2 *= 1000.0; //-inf
cout << "오버플로우가 일어난 num1 * 1000의 값: " << num1 << endl;
cout << "언더플로우가 일어난 num2 * 1000의 값: " << num2 << endl;
return 0;
}
'C++' 카테고리의 다른 글
C++ : bool형 변수에 문자상수 바로 입력시 반환되는 값(1일까? 0일까?) (0) | 2023.12.22 |
---|---|
C++ : static_cast<자료형>(변수) (0) | 2023.12.19 |
C++ : std::numeric_limits<자료형>::멤버함수() (0) | 2023.12.19 |
C++ : string 자료형이란? (C언어의 char배열과 비교) (0) | 2023.11.22 |
C++ : printf, scanf 함수 대신 cout, cin 객체로 입출력하기 (0) | 2023.11.22 |