C++ int, long int, long long int 어떤 걸 써야할까

C++ integer data

(출처: https://ko.cppreference.com/w/cpp/language/types)

(LP32, ILP32, LLP64, LP64는 data model을 나타내며, 글 맨 아래 '참고'에 정리해둠)



C++ 정수형 데이터 타입들

C++ standard를 기준으로

    short                 - 최소 16비트

    int                    - 최소 16비트

    long int             - 최소 32비트

    long long int      - 최소 64비트

(C++ standard는 정수형 데이터 타입의 명확한 크기를 정해두지 않았다. 다만 최소한의 하한선만 정해놓았다)


일반적으로 short16비트, int32비트로 알고 있다.

그래서 int-2^31 ~ 2^31 – 1 범위의 정수를 표현할 수 있고, 이보다 크거나 작은 정수를 표현하기 위해서는 비트수가 더 필요하다.

그러면 long을 써야하나 long long을 써야하나?

확실한 방법은 long long int를 쓰는 것이다.

C++ 표준을 보면 long int는 최소 32비트를 보장한다고 한다.

-2^31 ~ 2^31 – 1 범위를 넘어서는 정수를 표현하기 위해서는 C++ 표준 기준으로 최소 64비트를 보장하는 long long int를 써야한다.

(long int를 쓸 경우, 윈도우 환경에서는 int와 똑같은 범위까지만 표현할 수 있다)



// 나만의 생각 시작

그러면 long int는 필요 없는 것 아닌가?

ILP32, LLP64, LP64 data model만 고려한다면 그렇다고 볼 수 있지 않을까 싶다.

왜냐하면 위 세 개의 data model에서는 intlong int의 비트수가 같거나, long intlong long int의 비트수가 같기 때문이다.

long int가 int 혹은 long long int와 크기가 같다면... 없어도... 괜찮지 않을까?

아직 모르는 게 많아서 답을 확정짓지 못하겠다.

다만

64비트 크기의 정수를 표현하기 위해서는 long long int를 쓰는 것이 가장 안전하다.



long이 필요 없다면 왜 존재할까?

Compatibility, 이전 data model을 사용하는 운영체제를 위해서 남겨두었다고 생각한다.

ILP32 data model보다 예전의 IP16L32(x86 계열 16비트 운영체제. MS-DOS)에서는 int16비트, long int32비트를 할당했다.

시간이 지나면서 더 큰 정수의 표현이 필요해지니 ILP32부터 64비트로 정수를 표현하는 long long int가 생긴 것이다.

그리고 이때부터 short16비트, int32비트가 자리를 잡은 것이다.

long intILP32, LLP32에서 여전히 32비트이고 LP64에서 64비트로 구분을 짓는다.

컴퓨터의 발전과 함께 long long int가 생겼고, 과거의 흔적으로 long int가 남아있지 않나 라는 것이 내 생각이다.

x86 계열의 16비트 운영체제에서는 int16비트, long int32비트이니 해당 운영체제 혹은 data model과 관련된 작업을 할 때는 long int를 구분해서 사용해야 할 것 같다.

 

결론

ILP32, LLP64, LP64 data model을 고려하였을 때(거의 대부분의 범용 컴퓨터 데이터 모델)

16비트 정수는 short, 32비트 정수는 int, 64비트 정수는 long long int를 사용하는 것이 내가 원하는 정수를 나타낼 때 안전하다.

// 나만의 생각 끝

 


참고

Data Model

LP32, ILP32, LLP64, LP64는 data model이다.

LP32에는 Win16 API가 해당되고 ILP32에는 Win32 API, Unix와 Unix 계열의 시스템(Linux, Mac)이 해당된다.

LLP64에는 Win64 API가 해당되고

LP64에는 Unix와 Unix 계열의 시스템(Linux, Mac)이 해당된다.

주로 쓰는 윈도우32비트윈도우64비트유닉스 계열 32비트유닉스 계열 64비트만 두고 보면,

ILP32에 윈도우 32비트, LLP64에 윈도우 64비트, LP64에 유닉스 계열 64비트로 생각하면 된다.


Data Model에 따른 int / long int / pointer 크기

    LP32    -    2 / 4 / 4

    LIP32    -    4 / 4 / 4

    LLP64    -    4 / 4 / 8

    LP64    -    4 / 8 / 8


생각해볼 거리

C++ Standard는 정수형 데이터 타입들에 대해서 왜 명확히 크기를 정하지 않고, 최소 크기만을 정하였을까?



댓글

이 블로그의 인기 게시물

C++ fstream 간단한 사용법(파일입출력)

x86 OS interrupts routine