본문 바로가기

Library/C/C++

32 / 64비트 환경에서 C/C++ 기본형의 크기

64비트 프로그래밍은, 서버 쪽에서 일하는 개발자가 아니라면 아직 피부에 와닿지 않을 것이다. 하지만 언제나 그렇듯이, 느끼지 못하는 사이에 세상은 달라진다. C/C++ 개발자라면 32비트에서 64비트로의 전환에서 가장 신경을 써야할 것은 기본 데이터 타입의 크기이다. 표준안에서 기본 데이터 타입의 크기는 얼마라고 명확하게 정해진 것이 아니라, 최소한 다른 자료형보다 크거나 같아야 한다는 식으로 정의되어 있기 때문이다.

더구나, 각 플랫폼에 따라서 32비트와 64비트 데이터 모델은 상이하기 때문에 이식성을 염두에 둔 코드를 작성하고자 한다면 반드시 이런 차이점을 염두에 두어야 한다. 32, 64비트 환경에서의 데이터 모델은 여러가지 존재하는데, 다음과 같다.

LP64 : long, pointer는 64비트, 그 외는 32비트와 동일
ILP64 : int, long, pointer는 64비트, 그 외는 32비트와 동일
LLP64 : long long과 pointer가 64비트 그 외는 32비트와 동일, 특히 long이 64비트가 아니라 32비트
ILP32 : int, long, pointer가 32비트, long long은 64비트
LP32 : long, pointer가 32비트, int는 16비트

*모든 모델에서 long long은 공통적으로 64비트


Apple Macintosh와 같은 경우, 32비트 환경에서는 LP32 모델을 채택하고 있으며, 우리가 관심을 가지는 Windows는 64비트 환경에서 LLP64 모델을 채택하고 있다. 즉, 64비트 Windows에서는 long long과 pointer 타입은 64비트이며, 나머지는 기존 32비트 모델과 동일하다. long 타입을 32비트로 유지한 LLP64 모델을 채택한 가장 커다란 원인은, 기존의 Win32 API에서 long 타입으로 선언된 구조체와 파일 포맷에 대한 호환성을 유지해야 하기 때문이다.


Win64 API 팀 블로그는 다음과 같다.
http://blogs.msdn.com/oldnewthing/archive/2005/01/31/363790.aspx