공부/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`값으로 처리