Search
Duplicate
🤪

오버플로우, 언더플로우

간단소개
오버플로우와 언더플로우에 대한 초간단 설명
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
잡지식
Scrap
태그
Float
undefined behavior
9 more properties

오버플로우란?

정수가 표현 가능한 값의 범위를 넘어서 원래 의도와 다른 동작이 일어나는 것을 오버플로우라고 합니다.
#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); }
C
복사
최적화 옵션에 따라 다른 결과가 나오는 이상한 코드. 그 원인은 오버플로우…

오버플로우가 아닌 것

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; }
C
복사
0이 아닌 값을 infinity가 아닌 값으로 나눴는데 0이 나왔다? 언더플로우 때문!

언더플로우가 아닌 것

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

같이 보면 좋은 글