64비트 기반 프로그래밍 _System Programming

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에 의해서 컴파일 환경이 몇비트인지 알수 있다.

덧글

댓글 입력 영역


통계 위젯 (블랙)

43
33
54306

블로그 랭킹 위젯

마우스오른쪽금지