공부/C언어
C언어 - Overflow / Underflow / 자료형
BKM
2024. 10. 17. 00:45
자료형의 최대값을 넘는 수를 변수에 대입(Overflow)하면, 처음으로 돌아가 초과분에 해당되는 수를 출력하게 된다.
#include <stdio.h>
int main()
{
char num1 = 128; // char에 저장할 수 있는 최댓값 127보다 큰 수를 할당
// 오버플로우 발생
unsigned char num2 = 256; // unsigned char에 저장할 수 있는 최댓값 255보다 큰 수를 할당
// 오버플로우 발생
printf("%d %u\n", num1, num2); // -128 0: 저장할 수 있는 범위를 넘어서므로
// 최솟값부터 다시 시작
return 0;
}
// output : -128, 0
반대로, Underflow의 경우에는 자료형이 담을 수 있는 최소값 미만의 수를 할당하게 되면 발생하는 현상으로, Overflow의 반대로 최대값부터 다시 시작한다.
reference : https://dojang.io/mod/page/view.php?id=32
C 언어 코딩 도장: 7.2 오버플로우와 언더플로우 알아보기
만약 정수 자료형에서 저장할 수 있는 범위를 넘어서면 어떻게 될까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. integer_overflow.c #include int main() { char num1 = 128; // char에 저장할 수
dojang.io
자료형 관련 헤더파일
`#include <limits.h>`
자료형의 최댓값과 최솟값이 정의된 헤더 파일
#include <stdio.h>
#include <limits.h> // 자료형의 최댓값과 최솟값이 정의된 헤더 파일
int main()
{
char num1 = CHAR_MIN; // char의 최솟값
short num2 = SHRT_MIN; // short의 최솟값
int num3 = INT_MIN; // int의 최솟값
long num4 = LONG_MIN; // long의 최솟값
long long num5 = LLONG_MIN; // long long의 최솟값
// char, short, int는 %d로 출력하고 long은 %ld로 출력, long long은 %lld로 출력
printf("%d %d %d %ld %lld\n", num1, num2, num3, num4, num5);
// -128 -32768 -2147483648 -2147483648 -9223372036854775808
return 0;
위와 같이 사용가능
`#include <stdint.h>`
크기별로 정수 자료형이 정의된 헤더 파일
#include <stdio.h>
#include <stdint.h> // 크기별로 정수 자료형이 정의된 헤더 파일
int main()
{
int8_t num1 = -128; // 8비트(1바이트) 크기의 부호 있는 정수형 변수 선언
int16_t num2 = 32767; // 16비트(2바이트) 크기의 부호 있는 정수형 변수 선언
int32_t num3 = 2147483647; // 32비트(4바이트) 크기의 부호 있는 정수형 변수 선언
int64_t num4 = 9223372036854775807; // 64비트(8바이트) 크기의 부호 있는 정수형 변수 선언
// int8_t, int16_t, int32_t는 %d로 출력하고 int64_t는 %lld로 출력
printf("%d %d %d %lld\n", num1, num2, num3, num4); // -128 32767 2147483647 9223372036854775807
uint8_t num5 = 255; // 8비트(1바이트) 크기의 부호 없는 정수형 변수 선언
uint16_t num6 = 65535; // 16비트(2바이트) 크기의 부호 없는 정수형 변수 선언
uint32_t num7 = 4294967295; // 32비트(4바이트) 크기의 부호 없는 정수형 변수 선언
uint64_t num8 = 18446744073709551615; // 64비트(8바이트) 크기의 부호 없는 정수형 변수 선언
// uint8_t, uint16_t, uint32_t는 %u로 출력하고 uint64_t는 %llu로 출력
printf("%u %u %u %llu\n", num5, num6, num7, num8); // 255 65535 4294967295 18446744073709551615
return 0;
}
위와 같이 사용 가능
`#include <float.h>`
실수 자료형의 양수 최솟값, 최댓값이 정의된 헤더 파일
#include <stdio.h>
#include <float.h> // 실수 자료형의 양수 최솟값, 최댓값이 정의된 헤더 파일
int main()
{
float num1 = FLT_MIN; // float의 양수 최솟값
float num2 = FLT_MAX; // float의 양수 최댓값
double num3 = DBL_MIN; // double의 양수 최솟값
double num4 = DBL_MAX; // double의 양수 최댓값
long double num5 = LDBL_MIN; // long double의 양수 최솟값
long double num6 = LDBL_MAX; // long double의 양수 최댓값
printf("%.40f %.2f\n", num1, num2); // 0.0000000000000000000000000000000000000118
// 340282346638528859811704183484516925440.00
printf("%e %e\n", num3, num4); // 2.225074e-308 1.797693e+308
printf("%Le %Le\n", num5, num6); // 2.225074e-308 1.797693e+308
return 0;
}
실수형의 Overflow / Underflow
실수형은 매우 작은 수(Underflow)에 대해 `0 혹은 쓰레기 값`으로 처리
자료형이 다룰 수 없는 큰 수(Overflow)에 대해서는 `inf`값으로 처리