본문 바로가기

Windows/_System Programming

64비트 기반 프로그래밍

1. 64비트와 32비트

구분 :
 
1. I/O BUS를 통해서 한번에 송 · 수신할 수 있는 데이터 크기

2. 데이터 처리능력


32비트 -> 64비트 :

1. 더 넓은 메모리 공간(가상 메모리) 활용(32비트 : 표현할수 있는 주소 4GB -> 64비트 : 표현할수 있는 주소 16TB)

2. 연산속도의 증가(32비트 : 최대 32비트 데이터 처리 --> 64비트 : 최대 64비트 데이터 처리)



2. 64비트 기반 프로그래밍

1) LLP64, LP64 :

 운영체제  모델  char  short  int   long   포이터
 Windows  LLP64  1바이트  2바이트  4바이트  4바이트  8바이트
 UNIX  LP64  1바이트  2바이트  4바이트  8바이트  8바이트

Windows에서는 포인터만 8바이트로 표현함으로써 32비트 시스템과의 호환성을 중시한다.


2) 64비트와 32비트 호환의 문제점 :

64비트 시스템에서는 포인터가 8바이트 이므로 int, long 등 정수형 데이터로 변환하게 되면 4바이트의 데이터 손실이 발생한다.
(하지만 변환하고자 하는 포인터가 4GB안에 있으면 4바이트로도 표현이 가능하므로 데이터 손실이 발생하지 않는다)


3) 64비트 표현 Windows 스타일 자료형 :

 WINDOWS 자료형  의미  정의 형태
 BOOL  Boolean variable  typedef int BOOL
 DWORD  32-bit unsigned integer  typedef unsigned long DWORD;
 DWORD32  32-bit unsigned integer  typedef unsigned int DWORD32
 DWORD64  64-bit unsigned integer  typedef unsigned __int64 DWORD64
 INT  32-bit signed integer  typedef int INT;
 INT32  32-bit signed integer  typedef signed int INT32
 INT64  64-bit signed integer  typedef signed __int64 INT64
 LONG  32-bit signed integer  typedef long LONG
 LONG32  32-bit signed integer  typedef signed int LONG32
 LONG64  64-bit signed integer  typedef signed __int64 LONG64
 UINT  Unsigned INT  typedef int UINT
 UINT32  Unsigned INT32  typedef unsigned int UINT32
 UINT64  Unsigned INT64  typedef unsigned __int64 UINT64
 ULONG  Unsigned LONG  typedef unsigned int ULONG
 ULONG32  Unsigned LONG32  typedef unsigned int ULONG32
 ULONG64  Unsigned LONG64  typedef unsigned __int64 LONG64
 PINT  INT에 대한 포인터  typedef int* PINT
 PINT32  INT32에 대한 포인터  typedef signed int* PINT32
 PINT64  INT64에 대한 포인터  typedef signed __int64* PINT64


4) Polymorphic 자료형(32비트 64비트 동시지원) :

#if defined(_WIN64)

     typedef __int64 LONG_PTR;
     typedef unsigned __int64 ULONG_PTR;

     typedef __int64 INT_PTR;
     typedef unsigned __int64 UINT_PTR;

#else

     typedef long LONG_PTR;
     typedef unsigned long ULONG_PTR;

     typedef int INT_PTR;
     typedef unsigned int UINT_PTR;

#endif

(참고 : 64비트 기반 프로젝트 구성시 _WIN64 매크로는 는 자동으로 삽입된다
          32비트 기반 프로젝트 구성시 _WIN32 매크로 자동 삽입)


5) 실제 적용 :

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

UINT_PTR CalDistance(UINT_PTR val1, UINT_PTR val2);

int _tmain()
{
        INT_PTR num1 = 10;
        INT_PTR num2 = 20;

       _tprintf(_T("Distance : %d UINT_PTR SIZE : %d \n"),
                CalDistance((UINT_PTR)&num1, (UINT_PTR)&num2), sizeof(num1));

        return 0;
}

UINT_PTR CalDistance(UINT_PTR val1, UINT_PTR val2)
{
          return val1 - val2;
}

sizeof에 의해서 컴파일 환경이 몇비트인지 알수 있다.