[Python] int: 임의 정밀도 정수
python int, python integer, 임의 정밀도, arbitrary precision, bignum
정의
Python의 int는 **임의 정밀도 정수(arbitrary precision integer)**다. C의 int32/int64처럼 비트 폭이 고정되지 않으며, 메모리가 허용하는 한 무한히 큰 정수를 표현한다. 내부는 PyLongObject 구조체로, 30비트 단위의 디지트 배열로 구현되어 있다.
기본 사용
python
x = 42
y = -7
z = 10 ** 100 # googol
big = 2 ** 1000
print(x, y)
print(z)
print(big.bit_length(), "bits") 결과
42 -7
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1001 bits2 ** 1000도 오버플로 없이 동작한다. C/Java라면 long도 표현 못 한다.
진법 리터럴
binary = 0b1010 # 2진수: 10
octal = 0o17 # 8진수: 15
hexa = 0xff # 16진수: 255
under = 1_000_000 # 가독성 언더스코어 (PEP 515)
진법 변환 함수:
python
n = 255
print(bin(n)) # 2진
print(oct(n)) # 8진
print(hex(n)) # 16진
print(int("ff", 16)) # 16진 문자열 → int
print(int("1010", 2)) # 2진 문자열 → int 결과
0b11111111
0o377
0xff
255
10정수 연산
| 연산자 | 의미 | 예시 |
|---|---|---|
+, -, * | 사칙연산 | 5 + 3 == 8 |
/ | 부동소수 나눗셈 | 7 / 2 == 3.5 |
// | 몫(floor division) | 7 // 2 == 3, -7 // 2 == -4 |
% | 나머지 | 7 % 2 == 1 |
** | 거듭제곱 | 2 ** 10 == 1024 |
divmod(a, b) | 몫·나머지 동시 | divmod(7, 2) == (3, 1) |
//는 수학적 floor라 음수에서 0으로 자르는 C와 다르다.
python
print(-7 // 2) # -4 (C: -3)
print(-7 % 2) # 1 (C: -1)
# 불변식: (a // b) * b + (a % b) == a
print((-7 // 2) * 2 + (-7 % 2)) 결과
-4
1
-7비트 연산
int는 무한 길이 2의 보수로 비트 연산을 지원한다.
a = 0b1100 # 12
b = 0b1010 # 10
print(a & b) # 8 (AND)
print(a | b) # 14 (OR)
print(a ^ b) # 6 (XOR)
print(~a) # -13 (NOT: -(a+1))
print(a << 2) # 48
print(a >> 1) # 6
캐싱: 작은 정수 객체
CPython은 -5 ~ 256 범위의 정수를 미리 만들어 캐싱한다. 같은 값이면 is로도 True가 된다.
python
a, b = 100, 100
print(a is b) # True (캐시)
c, d = 1000, 1000
print(c is d) # 보통 False, REPL에선 컴파일 단위로 True일 수도
# 동등성 비교는 항상 ==
print(c == d) 결과
True
False
Trueis는 객체 동일성, ==는 값 동일성. 정수 비교는 항상 == 를 써라.
유용한 메서드
n = 255
n.bit_length() # 8 (2의 보수 폭, 부호 비트 제외)
n.bit_count() # 4 (Python 3.10+, 1비트 개수)
n.to_bytes(2, "big") # b'\\x00\\xff'
int.from_bytes(b"\\x00\\xff", "big") # 255
bool은 int의 서브클래스
True와 False는 각각 int(1), int(0)이다.
python
print(True + 1) # 2
print(isinstance(True, int)) # True
print(sum([True, False, True, True])) # 3 (카운트 트릭) 결과
2
True
3성능 노트
- 64비트 이하 정수는 거의 C와 비슷한 속도지만, 매번 객체를 할당하므로 NumPy
int64배열이 훨씬 빠르다. - 거대한 정수 곱셈은 Karatsuba 알고리즘을 쓴다.
- Python 3.11+ 에서
int(s)변환의 보안 패치로 4300자 이상은 기본적으로ValueError(DoS 방지).
💬 댓글