모든 시스템에서 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; 이랑 차이가..?”