C, Cpp
오버플로우 ? 언더플로우
흑조롱이
2023. 9. 13. 10:09
오버플로우는 선언한 자료형이 감당할 수 있는 크기보다, 더 큰 값이 들어올 경우 발생하는 현상이다.
언더플로우의 경우, 자료형에 담을 수 있는 가장 작은 수 보다, 더 작은 수를 담으려고 할 때 발생한다.
예를 들어 C의 char 자료형은 -128이상 127 이하의 수를 담을 수 있다.
만약 char에 -129가 들어간다면, 언더플로우가 발생해서 그 값이 char의 최댓값인 127로 변경된다.
반대로 char에 130이 들어가면, 오버플로우가 발생하고, 값은 최솟값 근처인 -126으로 바뀐다.
char, int의 오버플로우, 언더플로우를 볼 수 있는 코드를 아래와 같이 작성했다.
#include <stdio.h>
int main(void)
{
char n1 = -129; // char에 저장 가능한 최솟값(-128)보다 작은 값
// 언더플로우 발생
int n2 = -2147483647-2; // int에 들어갈 수 있는 최솟값(-2147483647-1)보다 작은 값 -> 언더플로우
char n3 = 130; // char에 저장 가능한 최댓값(127)보다 큰 값 -> 오버플로우
n2 = 2147483647 + 1; // int에 들어갈 수 있는 최댓값(2147483647)보다 큰 값 -> 오버플로우
printf("when char is below -128: %d\n", n1); // -128 == char의 최솟값
printf("when int is below -2147483647-1: %d\n", n2); // 2147483647 == int의 최솟값
printf("when char is over 127: %d\n", n3); // 127 == char의 최댓값
printf("when int is over 2147483647: %d\n", n2); // 2147483647 == int의 최댓값
return 0;
}
실행결과는 아래와 같으며, 코드에서 설정한 것과 다른 값들이 출력되는 현상을 볼 수 있다.

코드에서 오버 또는 언더플로우가 발생하는 부분이 있다면, VSCode뿐만 아니라 build할 때에도 경고를 띄워준다.


오버플로우 및 언더플로우에 대해서 들어본 적은 있었는데, 코드를 통해서 실제로 보는 건 이번이 처음이었다.
그래도 VSCode와 MinGW가 미리 경고를 알려준다는 점이 다행인 것 같다.