[C언어] overflow
Overflow는 C 언어에서 변수에 저장할 수 있는 용량을 초과하는 값을 할당할 때 발생합니다. 크게 두 가지 종류의 오버플로우가 있습니다: 정수 오버플로우와 부동소수점 오버플로우입니다.
1. 정수 오버플로우 (Integer Overflow)
정수형 변수에 저장할 수 있는 값의 범위를 벗어나는 연산 결과가 발생할 때 정수 오버플로우가 발생합니다. 예를 들어, int 타입 변수는 32비트에서 표현 가능한 값의 범위가 -2,147,483,648에서 2,147,483,647까지입니다. 만약 이 범위를 초과하는 값을 할당하려 하면 wrap-around(순환) 현상이 발생하여 값이 반대쪽 끝으로 순환됩니다.
#include <stdio.h>
int main() {
int a = 2147483647; // int의 최대값
a = a + 1; // 정수 오버플로우 발생
printf("%d\n", a); // 출력: -2147483648
return 0;
}
위 코드에서는 int의 최댓값에 1을 더하면 오버플로우가 발생해 최솟값인 -2147483648이 출력됩니다. 이를 wrap-around라고 부릅니다.
[C언어] warp-around
C 언어에서 Wrap-around는 특정 데이터 타입의 최대값이나 최소값을 초과할 때 값이 다시 최소값 또는 최대값으로 돌아가는 현상을 말합니다. 이는 데이터 타입의 고정된 비트 크기 때문에 발생하
jeagyoo2.tistory.com
2. 부동소수점 오버플로우 (Floating-Point Overflow)
부동소수점 숫자는 매우 큰 값을 표현할 수 있지만, 그 한계를 넘는 값을 처리하려고 할 때 오버플로우가 발생합니다. C에서 부동소수점 오버플로우는 보통 inf로 표시되며, 이는 '무한대'(infinity)를 의미합니다.
#include <stdio.h>
int main() {
float b = 3.4e38; // float로 표현 가능한 최대값에 가까운 값
b = b * 100.0f; // 부동소수점 오버플로우 발생
printf("%f\n", b); // 출력: inf
return 0;
}
위의 경우, 부동소수점 값이 최대 한도를 넘으면 inf로 출력됩니다.
Overflow 방지 방법
오버플로우를 방지하려면 데이터 타입을 적절히 선택하고, 연산 전에 범위를 초과할 가능성이 있는지 확인해야 합니다. 예를 들어, 정수 연산의 경우 unsigned long long과 같은 더 큰 데이터 타입을 사용하거나, 오버플로우가 발생할 수 있는 조건을 사전에 검사하는 방법을 사용할 수 있습니다.
이러한 오버플로우는 특히 임베디드 시스템이나 저수준 프로그래밍에서 중요하게 다뤄지며, 예상치 못한 동작을 방지하기 위해 세심한 주의가 필요합니다.