hahahia

64bit 기반 프로그래밍 본문

Windows Programming/Windows::System

64bit 기반 프로그래밍

hahahia 2012. 3. 2. 22:07
1. 64비트와 32비트

나누는 기준
- I/O BUS를 통하여 한번에 송신 및 수신할 수 있는 데이터의 크기
- 데이터 처리능력

32비트에서 64비트로
- 더 넓은 메모리 공간 활용가능(32비트 : 표현할 수 있는 주소 4GB -> 64비트 : 표현할 수 있는 주소 16TB)
- 연산속도가 빨라진다(32비트 : 최대 32비트 데이터 처리 -> 64비트 : 최대 64비트 데이터 처리) 

2. 64bit 기반 프로그래밍

- LLP64, LP64

 운영체제 모델  char  short  int  long  포인터 
Windows  LLP64 1byte  2byte  4byte  4byte  8byte 
Unix LP64  1byte  2byte  4byte  8byte  8btye  

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

- 64비트와 32비트 공존의 문제점

#include <stdio.h>
int main()
{
int arr[10] = {0,};
int arrVal = (int)arr; // 64비트 시스템에서는 포인터의 크기와 int형의 크기가 다                                         르기 때문에 형변환 과정에서 데이터 손실이 발생한다
printf("pointer = %d\n", arrVal);
return 0;


"64비트 시스템에서는 포인터가 지니고 있는 주소값을 4바이트 정수형으로 형 변환하지 말자."
 
-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 DOWRD32 
 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 unsigned int UINT 
 UINT32  Unsigned INT32   typedef unsigned int UINT32 
 UINT64    Unsigned INT64   typedef unsigned __int64 UINT 64 
 ULONG  Unsigned LONG   typedef unsigned int ULONG 
 ULONG32  Unsigned LONG32   typedef unsinged int ULONG32 
 ULONG64  Unsigned LONG64   typedef unsigned __int64 UNLOG64 

프로그래밍을 통해 변수 2개의 거리차이가 얼마나 나는지
확인 할 때 포인터를 이용해 주소값의 차를 계산하는데 64비트와 32비트의 포인터의 크기가 다르기 때문에 정확한 계산이 불가능할 때가 있다.
#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 UNIT_PTR;

#endif 
이름에 PTR이 붙어서 자료형을 포인터라고 생각하기 쉬운데, 실제로 보면 포인터가 아닙니다. PTR이라 이름을 붙인 이유는 포인터값 기반의 산술연산을 위해 정의된 자료형이기 때문입니다.
32비트 시스템과 64비트 시스템의 포인터의 크기가 다르기 때문에 생기는 문제를 해결하기위해 만들어진 자료형이다.
#define _WIN64를 통해 운영체제를 확인하여 운영체제에 따른 포인터의 크기의 호환성을 맞춰주는 역할을 합니다.
 
ex)

/* PolymorphicType2.cpp */
 
#include <stdio.h>
#include <tchar.h>
#include <windows.h>

UINT_PTR CalDistance(UINT_PTR a, UINT_PTR b)
{
return a-b ;
}

int _tmain(void)
{
INT32 val1 = 10;
INT32 val2 = 20;

_tprintf(_T("Distance : %d\n"), CalDistance((UINT_PTR)&val1, (UINT_PTR)&val2)); // 12
return 0;

출처. 윈도우즈 프로그래밍 | 윤성우 저  | 한빛미디어 
Comments