정수 자료형 범위 계산기 쉽게 이해하기 — 개념과 원리
int8, int16, int32, int64 같은 고정 폭 정수형은 담을 수 있는 값의 범위가 정해져 있습니다. 범위를 넘으면 오버플로가 일어나 값이 돌아가거나, 오류가 나거나, C의 부호 있는 정수처럼 정의되지 않은 동작이 됩니다. 비트 수를 고르면 부호 있는 범위, 부호 없는 최댓값, 최댓값의 10진 자릿수를 보여 주므로 데이터베이스 열, 파일 형식의 필드, 카운터나 ID 변수의 자료형을 정할 때 유용합니다.
계산 방법
- 부호 있는 정수(2의 보수): −2ⁿ⁻¹부터 2ⁿ⁻¹ − 1까지입니다.
- 부호 없는 정수: 0부터 2ⁿ − 1까지입니다.
- 10진 자릿수: floor(n × log₁₀ 2) + 1로, 부호 없는 최댓값 2ⁿ − 1의 자릿수입니다(log₁₀ 2 ≈ 0.30103).
큰 정수 연산으로 정확히 계산하므로 128비트도 오차가 없습니다.
원리
n비트로 만들 수 있는 패턴은 2ⁿ가지입니다. 부호 없는 형은 이를 0 … 2ⁿ − 1에 대응시킵니다. 2의 보수는 맨 앞 비트에 +2ⁿ⁻¹ 대신 −2ⁿ⁻¹의 가중치를 주어 패턴의 절반을 음수로 만듭니다. 0이 음이 아닌 쪽 패턴 하나를 차지하므로 음수 쪽이 양수 쪽보다 하나 더 많습니다. 비트 하나는 10진수 약 0.301자리에 해당해, 10비트면 약 3자리입니다(2¹⁰ = 1024 ≈ 10³).
예제 풀이
- 입력은 32비트입니다.
- 부호 있는 최솟값은 −2³¹ = −2147483648, 최댓값은 2³¹ − 1 = 2147483647입니다.
- 부호 없는 최댓값은 2³² − 1 = 4294967295입니다.
- 자릿수는 32 × 0.30103 = 9.63의 내림 9에 1을 더한 10이며, 실제로 4294967295는 10자리입니다.
결과 해석
기준값으로 int8은 −128 … 127(uint8은 255까지), int16은 −32768 … 32767(uint16은 65535까지), int64의 최댓값은 9223372036854775807, 약 9.22 × 10¹⁸입니다. 부호 있는 32비트로 초를 세면 약 68년 뒤 넘치는데, 이것이 2038년 문제입니다. 32비트 ID 열은 약 21억 행에서 바닥납니다. 계속 늘어나는 금액이나 ID에는 여유가 충분한 자료형을 고르십시오.
흔한 실수
- 비대칭을 잊는 것(−(−2147483648)은 int32에 들어가지 않습니다)
- 자릿수를 부호 있는 최댓값의 자릿수로 읽는 것(64비트에서 부호 없는 최댓값은 20자리, 부호 있는 최댓값은 19자리입니다)
- C의 int가 항상 32비트라고 생각하는 것(표준은 최소 16비트만 보장합니다)
- 2⁵³ − 1 = 9007199254740991보다 큰 정수를 자바스크립트 숫자나 JSON 실수로 다루어 정밀도를 잃는 것
자주 묻는 질문
int8의 최솟값은 왜 −127이 아니라 −128입니까?
2의 보수에서 10000000이 −128을 뜻하고 0은 하나뿐이라 음수가 하나 더 남습니다.
값 N을 담으려면 몇 비트가 필요합니까?
부호 없이 floor(log₂ N) + 1비트이고, 음수가 필요하면 부호 비트 하나를 더합니다.
파이썬에도 int64 제한이 있습니까?
파이썬 기본 정수는 임의 정밀도이며, NumPy 같은 라이브러리에서만 고정 범위가 적용됩니다.
출처: ISO/IEC 9899 (C standard), <stdint.h> exact-width integer types · Randal E. Bryant and David R. O'Hallaron, Computer Systems: A Programmer's Perspective, Pearson