[C-Trick] int 최댓값 찾기

모든 시스템에서 int 최댓값 찾기


요즘은 대부분 int 형이 4byte이지만 여전히 다양한 컴파일 환경에 따라 달라지게 된다.
이때 int 값이 해당 시스템에서 나타낼 수 있는 최댓값을 찾는 함수를 zlib안에서 찾게 되어 작성해 본다.

소스코드

unsigned ZLIB_INTERNAL gz_intmax()
{
    unsigned p, q;

    p = 1;
    do {
        q = p;
        p <<= 1;
        p++;
    } while (p > q);
    return q >> 1;
}

동작 원리

만일 int가 2byte인 곳에서 저 함수를 실행 했다고 가정해 보자

4byte의 표현은 0000 0000 0000 0000으로 나타내고 5번째 줄에 서 p=1이라고 했으니 p는 0000 0000 0000 0001이 된다. 그리고 q에 p 값을 넣고 p는 1 증가 시킨다. 그리고 (p > q)일때 까지 반복한다.

이때 p와 q의 상태를 보면

p

q

0000 0000 0000 0001 NOT SET
0000 0000 0000 0011 0000 0000 0000 0001
0000 0000 0000 0111 0000 0000 0000 0011

……

1111 1111 1111 1111 0111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111

위 표와 같이 p는 1111 1111 1111 1111이 될 때 까지 증가 하는데 이때 p와 q가 같아지게 된다.
그리고 q에서 1비트를 줄인 값을 return하게 되면 해당 컴파일 환경에서 지원하는 int의 최댓값을 알아 낼 수 있다!

다양한 환경에서 컴파일 되어야 하는 프로그램의 경우 해당 트릭을 사용하면 좋을 것 같다.

+++

철수 형님 日
         “return ((unsigned int)(-1))>>1; 이랑 차이가..?”

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.