새소식

반응형
개발 (Development)/┣Python

파이썬에서 int로 캐스팅한 변수는 오버플로우가 날까?

  • -
반응형

1. Introduction

파이썬을 주로 쓰는 사람은 알겠지만 파이썬은 대표적인 타입리스 언어이다.

따라서 변수에 숫자가 몇 자리든 그냥 대입하면 대입하는 대로 초기화된다.

하지만 파이썬에도 엄연히 암묵적으로 변수의 타입을 정해두고 있다. 그 중에는 코더에게 친숙한 int가 있다.

그럼 여기서 의문이 생긴다. c나 자바같은 언어에서는 int의 범위가 4바이트로 제한되어 있다. 파이썬도 암묵적으로라도 타입이 있다면 오버플로우가 나지 않을까?

2. practice

파이썬3를 기준으로 정수의 최댓값은 sys의 maxsize로 알아낼 수 있다.

또한 type메서드는 암묵적인 변수의 타입을 알아낼 수 있는 메서드이다.

a = int(sys.maxsize)
print(a, type(a))
a += 1
print(a, type(a))

<< 2147483647 <class 'int'>
<< 2147483648 <class 'int'>

놀랍게도, 오버플로우가 일어나지 않는다. 거기에 타입 또한 int 그대로 유지된다.

 

그럼 파이썬은 어떻게 오버플로우 문제를 해결했을까?

파이썬은 이진수를 그대로 레지스터나 메모리에 저장하는 c나 자바와 다르게 arbitrary-precision arithmetic를 사용한다.

struct {
	unsigned long length;
	digit* digits;
] bignum;

c로 짜여진 간단한 arbitrary-precision arithmetic이다.

length는 자리수를, digits는 각 자리의 수들을 의미한다.

arbitrary-precision arithmetic로 숫자 1004는 다음과 같이 저장된다.

length = 4
digits[0] = 4
digits[1] = 0
digits[2] = 0
digits[3] = 1

 

이런 구조를 가진 탓에 이진 연산을 통해 하드웨어의 힘을 받을 수가 없어 산술 연산이 느리다.

하지만, 매우 큰 수를 다를 때의 제약조건을 해방시켜준다는 것은 나름의 장점이 된다고 생각한다. 또한, 부동소수점도 비슷하게 처리하기 때문에, 언제나 정확한 연산을 제공한다. c가 같은 변수의 sqrt 값을 비교할 때, A == B를 못 쓰고 A - B < 1e-9 같이 표현한다는 것을 보면, 더더욱 크게 느껴진다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.