본문 바로가기
웹개발일지/C언어

자료형 최대값(MAX), 최소값(MIN)을 알려주는 헤더 및 사용법

by 경험을 기록으로 2020. 9. 2.
반응형
#include <stdio.h>
#include <limits.h> // MAX, MIN 값을 자동으로 출력해주는 헤더

int main()
{
 
    unsigned int i = 0b11111111111111111111111111111111;
    unsigned int u_max = UINT_MAX;
    signed int i_max = INT_MAX;
    signed int i_min = INT_MIN;
    
    printf("%lu\n", sizeof(unsigned int)); // 4 (byte)
    printf("%lu\n", sizeof(i)); // 4 (byte)
    printf("%u\n", i); // 4294967295
    printf("%u\n", u_max); // 4294967295
    printf("%d\n", i_max); // 2147483647
    printf("%d\n", i_min); // -2147483648
    
    return 0;
}

 

개인 공부로 시작한 C언어에서 중요한 부분인 것 같아 메모를 남긴다.

C언어에서 제공하는 자료형(Data type)에서는 int, float, double, long 등이 있다.

 

위 코드에서 보면 unsigned int는 음의 정수를 제외한 양의 정수로만 사용하는 자료형이다.

int의 메모리 차지 수는 4byte이다. 

그것을 알아보기위해서는 sizeof()라는 함수를 사용할 수 있다.

예를 들어 sizeof(unsigned int); 로 말이다.

이것을 출력하려면 당연히 printf("%lu\n", sizeof(unsigned int)); 로 하면 확인할 수 있다.

여기서 %lu는 unsigned int가 long형이기 때문에 %d 또는 %u로 하면 우선 출력은 되지만 정확한 형식지정자는 아닌것이다.

 

똑같은 결과값이 나오지만 2진수로 변수에 대입하여 똑같이 출력해보았다.

2진수를 작성하는 방법은 0(숫자)b(알파벳)을 앞에 붙히고 입력하면 된다.

4byte는 결국 32bit (1byte가 8bit이므로 4byte는 8*4=32bit이다)가 된다.

이것을 2진수로 표현하면 11111111 11111111 11111111 11111111 총 32bit, 즉 4byte가 된다.

그럼 위의 코드처럼 예를 들어 unsigned int i라는 변수에 0b11111111111111111111111111111111 를 대입해보고

똑같이 printf("%lu\n", sizeof(i));  로 출력해보면 결과값으로 4 라는 것을 확인할 수 있을 것이다.

 

그럼 이 unsigned int 자료형의 4byte에 들어갈 수 있는 최대값은 얼마일까?

이번엔 sizeof 함수를 넣지 않고 그래도 printf함수와 형식지정자만 사용하여 확인해보자.

printf("%u", i); // 현재 unsigned int i 변수에는 0b11111111111111111111111111111111 값이 들어가 있는 상태다.

위의 printf("%u", i);를 실행시켜보면 4294967295 라는 숫자가 출력되는 것을 확인할 수 있다.

 

그럼 계산기로도 확인해보자.

저자는 맥을 이용하므로 맥의 계산기 앱을 작동시켜 계산기 보기 메뉴에서 '공학용'을 선택한 뒤

2의 32승(2의32제곱)을 계산해보았다.

 

 

그러니 결과값은 4294967296 이란 결과가 나왔다.

C에서 출력된 결과와 1 많은 값이 출력되는데 이 이유는 컴퓨터언어에서 기본적으로 시작되는 숫자는 1이 아닌 0부터 이기 때문에

계산기로 계산한 결과보다 1 작게 출력되는 것이다.

 

그럼 이것을 항상 2진수를 넣어서 테스트해야한다면 상당히 번거로울 것이다.

그럴 때 유용한 라이브러리가 있다.

limits.h 라는 것이 참 유용하다.

 

선언부에 #include <limits.h> 를 선언한 뒤,

예를 들어 unsigned int u_max = UINT_MAX; 라고 해주면 limits.h에서 제공해주는 함수 UINT_MAX가 unsigned int의 최대값을 

넣어준다.

 

unsigned int u_max = UINT_MAX;

printf("%u", u_max);

signed int의 최대값 / 결과 : 4294967295

 


 

만약 unsigned int가 아닌 signed int 즉, int로만 할 경우, 음수와 양수를 지정하는 것이 메모리 제일 처음 값(?)에 부호를 지정하는 용도로 사용하는데, 그럼 int의 최대값 그리고 int는 음의 정수도 표시하므로 최소값을 알아보려면 이렇게 하면 된다.

 

int i_max = INT_MAX;

printf("%d", i_max);

signed int의 최대값 / 결과 : 2147483647

 

int i_min = INT_MIN;

printf("%d", i_min);

signed int의 최소값 / 결과 : -2147483648

 

 

 

참고 강좌 : [따배씨] 3.6 정수의 오버플로우overflow | 따라하며 배우는 C언어, c언어 , 컴퓨터 작동원리, 코딩

 

※ 홍정모 교수님의 유튜브 영상을 참고하여 작성하였습니다.

반응형
LIST