일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- System
- API
- 윈도우즈
- beans
- 자료구조
- UTF-8
- Call-by-reference
- Kafka
- Sort
- c++
- 포인터
- java
- algorithm
- windows
- JavaScript
- 투자
- OOP
- CLASS
- CSS
- meta
- array
- request
- WebProgramming
- HTML
- 악성코드
- function
- query
- C
- 노드
- jsp
Archives
- Today
- Total
hahahia
64bit 기반 프로그래밍 본문
1. 64비트와 32비트
나누는 기준
- I/O BUS를 통하여 한번에 송신 및 수신할 수 있는 데이터의 크기
- 데이터 처리능력
32비트에서 64비트로
- 더 넓은 메모리 공간 활용가능(32비트 : 표현할 수 있는 주소 4GB -> 64비트 : 표현할 수 있는 주소 16TB)
- 연산속도가 빨라진다(32비트 : 최대 32비트 데이터 처리 -> 64비트 : 최대 64비트 데이터 처리)
2. 64bit 기반 프로그래밍
- LLP64, LP64
Windows에서는 32비트 시스템과의 호환성을 중시하기 때문에 포인터만 8바이트로 표현한다.
- 64비트와 32비트 공존의 문제점
"64비트 시스템에서는 포인터가 지니고 있는 주소값을 4바이트 정수형으로 형 변환하지 말자."
-64비트 시스템 Windows 스타일 자료형
프로그래밍을 통해 변수 2개의 거리차이가 얼마나 나는지
확인 할 때 포인터를 이용해 주소값의 차를 계산하는데 64비트와 32비트의 포인터의 크기가 다르기 때문에 정확한 계산이 불가능할 때가 있다.
#endif
이름에 PTR이 붙어서 자료형을 포인터라고 생각하기 쉬운데, 실제로 보면 포인터가 아닙니다. PTR이라 이름을 붙인 이유는 포인터값 기반의 산술연산을 위해 정의된 자료형이기 때문입니다.
32비트 시스템과 64비트 시스템의 포인터의 크기가 다르기 때문에 생기는 문제를 해결하기위해 만들어진 자료형이다.
#define _WIN64를 통해 운영체제를 확인하여 운영체제에 따른 포인터의 크기의 호환성을 맞춰주는 역할을 합니다.
ex)
출처. 윈도우즈 프로그래밍 | 윤성우 저 | 한빛미디어
나누는 기준
- 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;
이름에 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;
} 출처. 윈도우즈 프로그래밍 | 윤성우 저 | 한빛미디어
'Windows Programming > Windows::System' 카테고리의 다른 글
프로세스와 스케줄링 및 컨텍스트 스위칭 (0) | 2012.03.06 |
---|---|
명령 프롬프트(cmd) 만들기 (3) | 2012.03.02 |
오류의 확인(GetLastError 함수) (0) | 2012.03.02 |
아스키코드 vs 유니코드(02. MBCS와 WBCS의 동시 지원) (0) | 2012.03.02 |
아스키코드 vs 유니코드(01. Windows에서의 유니코드(UNICODE)) (0) | 2012.03.02 |
Comments