이쁜왕자 만쉐~~

[C] short, int, long, long long 본문

프로그래밍/C프로그래밍 문제

[C] short, int, long, long long

이쁜왕자 2021. 6. 9. 00:43

C 언어에서는 변수의 타입이 아주 요상하게 정의되어 있다.

 

Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16 bits, longs are at least 32 bits, and short is no longer than int, which is no longer than long.

 

이게 TCPL 에 써있는 그대로 긁어 온 것이다.

 

short : 16비트 이거나 이보다 크다.

int : 16비트 이거나 이보다 크다. 또한 short 보다 크거나 같다.

long : 32비트 이거나 이보다 크다. 또한 int 보다 크거나 같다.

 

덤으로 int 에 대해서는 이런 언급이 되어 있다.

 

Plain int objects have the natural size suggested by the host machine architecture. 

 

예전의 16비트 머신 (예를 들어 80286) 에서는 int 는 16비트 였을 것이다. 그리고 80386 같은 32비트 머신에서는 int 는 32비트 이다.

 

32비트 시스템에서는 대체로 아래와 같이 사용한다.

 

short : 16 비트

int : 32 비트

long : 32 비트 (or 64 비트)

 

.......

 

문제는 64비트 시스템으로 넘어가서는 어쩔 것이냐??? 이다.

 

Visual C++ 같은데서는 Int64 를 선언해서 사용했고, gcc 같은데서는 long long 을 만들어 사용했다. 결국 C99 에서는 long long 을 표준으로 추가하였다.

 

long long : 64비트 이거나 이보다 크다. 또한 long 보다 크거나 같다.

 

추가로 pointer 타입도 64비트가 된다.

 

문제가 되는 것은 int 이다.

 

int 의 정의에 따라 int 를 64비트를 쓸 것인가?

 

이렇게 될 경우 정의상 long 역시 64비트(또는 그 이상)를 써야 한다.

그래서, int 64, long 64(또는 그 이상), long long 64(또는 그 이상) 이 되어 버린다. short 를 16으로 사용하면 32비트에 대한 적당한 타입이 존재하지 않게 되고, 반대로 short 를 32로 사용하면 16비트에 대한 적당한 타입이 사라진다.

 

이에 대한 대충의 코멘트를 정리하면, '뭐 그렇게 쓸 수도 있겠지만, 그러면 여러 사람이 피곤할 껄?' 이기에 이 안을 사용하는 컴퓨터 아키텍쳐는 없다.

 

 

그래서, 64비트 시스템에서도 int 를 그냥 32비트로 쓴다.

 

이 경우 short 16, int 32, long 32 또는 64, long long 64 또는 그 이상이 된다.

 

long 을 32로 쓰냐 64로 쓰냐에 따라 크게 갈리게 된다.

long 을 32 비트로 쓰는 것을 LLP64 모델이라고 부르는데, MS windows 에서 채택했다.

long 을 64 비트로 쓰는 것을 LP64 모델이라고 부르는데, UNIX 및 Linux 진영에서 채택한 방식이다.

 

참고로 P 는 pointer 를 뜻하며 두 모델 모두 포인터는 64비트 이다.

 


결국 이 문제는 int8_t, int16_t, int32_t, int64_t 이 추가되는 것으로 귀결되었다. 네트워크 프로그래밍 등에서는 정확하게 1바이트, 정확하게 2바이트 같은 타입이 필요한데, 결국 이를 위해서 해당 타입이 만들어졌다. 개발자는 해당 타입으로 선언하고 프로그래밍하고, 빌드환경에서는 해당 타입에 맞는 타입으로 자동으로 매치시켜 사용하도록 되는 것이다.

 

https://en.cppreference.com/w/c/types/integer

 

Fixed width integer types (since C99) - cppreference.com

int8_tint16_tint32_tint64_t(optional) signed integer type with width of exactly 8, 16, 32 and 64 bits respectivelywith no padding bits and using 2's complement for negative values(provided if and only if the implementation directly supports the type) (type

en.cppreference.com

이 타입은 C99 또는 C++11 에 정식 추가가 되었고, C99 / C++11 미지원 컴파일러이더라도 gcc 같은 경우 자체적으로도 잘 지원해 주긴 한다. 하지만, 맹점이 없는건 아니어서, 해당 타입은 optional 이다. 그래서, 시스템에서 지원하지 않으면 사용할 수 없다.

 

 

 

728x90
반응형
Comments