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에 의해서 컴파일 환경이 몇비트인지 알수 있다.
'Windows > _System Programming' 카테고리의 다른 글
프로세스의 생성과 소멸 (0) | 2010.02.09 |
---|---|
명령 프롬프트(Cmd) 작성 (0) | 2010.02.09 |
Windows에서의 문자셋(Character Sets) (0) | 2010.02.08 |
시스템 프로그래밍(System Programming)의 시작 (2) | 2010.02.08 |
윈도우 파일시스템(File System) (2) | 2010.02.05 |