오버플로우란?

정수가 표현 가능한 값의 범위를 넘어서 원래 의도와 다른 동작이 일어나는 것을 오버플로우라고 합니다.

#include <stdio.h>
#include <limits.h>

int main()
{
    const int   A = INT_MAX;
    const int.  B = A + 1;

    if (A < B)
        printf("%d가 %d보다 크대요!\\n", B, A);
}

오버플로우가 아닌 것

unsigned integer의 범위를 벗어나는 것은 의외로 오버플로우가 아닙니다.

A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.

C 표준에서 unsigned integer의 연산 결과는 표현 가능한 값의 개수로 나눈 나머지가 되고,

이로 인해 unsigned integer에서의 오버플로우는 일어날 수 없다고 정의하고 있습니다.

그 외의 오버플로우

버퍼 오버플로우 공격이나 CSS의 오버플로우 등등 다양한 오버플로우가 있습니다.

이 글에서는 정수 오버플로우에 대해서만 다뤘습니다.

언더플로우란?

부동소수점에서 표현 가능한 최소 범위보다 작아져서 0이 아니어야 할 것이 0이 되어버리는 것을 언더플로우라고 합니다.

#include <stdio.h>
#include <float.h>

int main() {
    if (DBL_MIN / DBL_MAX == 0.0)
        printf("%.308lf / %.lf == 0\\n", DBL_MIN, DBL_MAX);
    return 0;
}

언더플로우가 아닌 것

정수의 표현 범위를 더 작은 쪽으로 벗어나는 것 (예를 들어 INT_MIN - 1)은 언더플로우가 아닌 오버플로우입니다.

같이 보면 좋은 글

int의 오버플로우가 위험한 이유

부동소수점의 저장 방식