본문으로 건너뛰기
김신건의 로그

[Python] int: 임의 정밀도 정수

· 수정 · 📖 약 1분 · 405자/단어 #python #int #number #integer #basics
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 bits

2 ** 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
True

is는 객체 동일성, ==는 값 동일성. 정수 비교는 항상 == 를 써라.

유용한 메서드

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의 서브클래스

TrueFalse는 각각 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 방지).

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기