[C++] int와 long의 크기와 범위는 같다.

seungtoctoc·2023년 12월 18일
0
post-thumbnail

백준 풀면서 절대값 함수 찾는데
int형, long형, double형 함수가 따로 있었다

그리고 소수점까지 써야하는 문제라
double 자료형 범위 찾아보는데
int와 long의 크기와 숫자 범위가 같은 것 (!)

전에는 자료형 크기 해봤자
문제에서 나오는 최대 숫자 넘는지 정도 확인 했었는데

요즘엔 메모리나 시간복잡도도 조금씩 생각해보는 중이라
찾아보다가 갑자기 궁금해져서 찾아봤다.

int :
-2,147,483,648 ~ 2,147,483,647
4바이트

long :
-2,147,483,648 ~ 2,147,483,647
4바이트

구글링 하다 찾은 2012년도의 블로그에서는

(C언어 에서)
int형은 "CPU의 레지스터와 동일한 크기를 가지는 타입"으로 정의되어 있다.
즉, 32비트 운영체제에서는 32비트(4바이트), 64비트 운영체제에서는 64비트의 크기를 가진다.

반면에 long형은 크기가 4바이트로 고정되어 있어 어떤 플랫폼 에서나 4바이트 이다.

라고 했지만,
블로그가 오래되기도 해서
최근 정보들을 찾아다녔다. (위에 블로그 일부 구라였음)


이제 찾은 정보들)

  1. 최초 C언어에서
    int는 가장 효율적으로 처리할 수 있는 정수타입의 의미로 개발되었으며,
    적어도 2바이트를 포함할 수 있는 자료형으로 정의되어 있다.

  2. 위의 글 처럼 int형은 아키텍쳐에 따라 크기가 달라졌
    (크기가 아키텍쳐 크기와 동일하게 변함),
    C89 표준 당시는 16비트가 가장 흔했다.
    • C언어는 1972년에 개발됨
    • 1983년에 C의 표준 확립. 1989년에 완성 (C89)

  1. 16비트 아키텍쳐가 흔했던 당시엔
    int는 16비트로 2바이트, long은 4바이트
    long은 말 그대로 int보다 긴 숫자들을 위한 자료형으로 충분했다.

  2. 그런데 64비트(8바이트) 아키텍쳐까지 개발되면서 문제가 생겼다.
    64비트 아키텍쳐에서
    int는 64비트로 8바이트인데 long은 4바이트로 모순이 발생한다.

  3. 이를 해결하기 위해
    64비트 이상의 아키텍쳐에서는 int의 크기를 32비트로 고정했고,
    이로 인해 int의 크기를 4바이트로 오해하는 환경이 만들어졌다.

즉, int는 16비트 까지는 아키텍쳐에 따라 크기가 달라지지만,
32비트 부터는 4바이트로 고정되는 것이다!


그런데 현재 시점에서
16비트 이하의 CPU는 찾아보기 힘들기 때문에
4바이트로 봐도 무방하긴 하다.

long을 안 가르쳐주고 안 쓰는 데는 다 이유가 있었다.
(몰라도 되므로)



도움이 되셨나요?


0개의 댓글