Win32 - 윈도우 자료형
[TOC]
32Bit vs 64Bit
- CPU로 한 번에 전송할 수 있는 데이터 크기
- CPU가 한 번에 처리할 수 있는 처리능력
윈도우 자료형
- https://docs.microsoft.com/en-us/windows/desktop/winprog/windows-data-types
- 윈도우에서 미리 자료형을 정의해놓았는데 이름을 왜 이렇게 붙였나라는 생각보다 그냥 받아들이자.
- C, C++에서 사용하던 자료형을 이름을 바꿔 정의하므로써 좀 더 의도에 맞는 변수타입을 결정할 수 있다.
| Type | 정의 | 크기 | 설명 |
|---|---|---|---|
| BYTE | typedef unsigned char BYTE | ||
| BOOL | typedef int BOOL | 1: TRUE/ 0: FALSE | |
| CHAR | typedef char CHAR | ||
| COLORREF | typedef DWORD COLORREF | 색상값을 저장 | |
| DWORD | typed unsigned long DWORD | ||
| PVOID | typedef void * HANDLE | 데이터형이 없는 메모리 주소 저장하는 포인터 P~로 시작하면 포인터 |
|
| HANDLE | typedef PVOID HANDLE | ||
| HDC | typedef HANDLE HDC | ||
| HGDIOBJ | typedef HANDLE HGDIOBJ | ||
| HINSTANCE | typedef HANDLE HINSTANCE | ||
| HWND | typedef HANDEL HWND | 핸들 관련 데이터는 void* 이다. | |
| WORD | typedef unsigned short WORD | 16-bit unsigned integer | |
| LPVOID | typedef void * LPVOID | ||
| LPWORD | typedef WORD *LPWORD | ||
| UINT | typedef unsigned int UINT | ||
| VOID | #define VOID void | ||
| WINAPI | #define WINAPI __stdcall | ||
| WORD | typedef unsigned short WORD | ||
| WPARAM | typedef UINT_PTR WPARAM | ||
| UINT_PTR | #if defined(_WIN64) typedef unsigned __int64 UINT_PTR #else typedef unsigned int UINT_PTR #endif |
||
| LPARAM | typedef LONG_PTR LPARAM | ||
| LONG_PTR | #if defined(_WIN64) typedef unsigned __int64 LONG_PTR #else typedef unsigned log LONG_PTR #endif |
자료형 크기
- short
- 16bit 이상
- int
- CPU가 다루는 가장 자연스러운 크기(CPU 레지스터, 데이터 버스)이고 16bit 이상
- C언어의 타입 정의에서 int 형은 “CPU의 레지스터와 동일한 크기를 가지는 타입”으로 정의(명확한 사이즈를 정의하지 않는다)
- long
- int보다 크거나 같고 32bit 이상
| OS | short | int | long |
|---|---|---|---|
| 16bit | 2 | 2 | 4 |
| 32bit | 2 | 4 | 4 |
| 64bit | 2 | 4 | 4/8 |
따라서 long형을 쓸 경우 다른 시스템으로의 이식을 위해서 long을 그대로 사용하면 안되고 stdint.h에 정의된 int64_t, int32_t 자료형을 사용해야한다.
64bit 데이터 모델
| OS | Model | char | shor | int | long | long long | Pointer |
|---|---|---|---|---|---|---|---|
| Windows | LLP64 | 1 | 2 | 4 | 4 | 8 | 8 |
| Unix | LP64 | 1 | 2 | 4 | 8 | 8 | 8 |
Windows 데이터 형식 범위
__로 시작하는 자료형은 비표준이다.
| 형식 이름 | 바이트 | 기타 이름 | 값의 범위 |
|---|---|---|---|
| int | 4 | signed | –2,147,483,648 ~ 2,147,483,647 |
| unsigned int | 4 | unsigned | 0 ~ 4,294,967,295 |
| __int8 | 1 | char | -128 ~ 127 |
| unsigned __int8 | 1 | unsigned char | 0 ~ 255 |
| __int16 | 2 | short, short int, signed short int | –32,768 ~ 32,767 |
| unsigned __int16 | 2 | unsigned short, unsigned short int | 0 ~ 65,535 |
| __int32 | 4 | signed, signed int, int | –2,147,483,648 ~ 2,147,483,647 |
| unsigned __int32 | 4 | unsigned, unsigned int | 0 ~ 4,294,967,295 |
| __int64 | 8 | long long, signed long long | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| unsigned __int64 | 8 | unsigned long long | 0 ~ 18,446,744,073,709,551,615 |
| bool | 1 | 없음 | false 또는 true |
| char | 1 | 없음 | -기본적으로 128 ~ 127 /J를 사용하여 컴파일된 경우 0~255 |
| signed) char | 1 | 없음 | -128 ~ 127 |
| unsigned char | 1 | 없음 | 0 ~ 255 |
| short | 2 | short int, signed short int | –32,768 ~ 32,767 |
| unsigned short | 2 | unsigned short int | 0 ~ 65,535 |
| long | 4 | long int, signed long int | –2,147,483,648 ~ 2,147,483,647 |
| unsigned long | 4 | unsigned long int | 0 ~ 4,294,967,295 |
| long long | 8 | 없음 (하지만 같음 __int64) | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| unsigned long long | 8 | 없음 (하지만 같음 unsigned __int64) | 0 ~ 18,446,744,073,709,551,615 |
| enum | varies | 없음 | |
| float | 4 | 없음 | 3.4E+/-38(7개의 자릿수) |
| double | 8 | 없음 | 1.7E+/-308(15개의 자릿수) |
| long double | 동일 double | 없음 | 동일 double |
| wchar_t | 2 | __wchar_t | 0 ~ 65,535 |
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 int 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 UINT64 |
| ULONG | Unsigned LONG | typedef unsigned int ULONG |
| ULONG32 | Unsigned LONG32 | typedef unsigned int ULONG32 |
| ULONG64 | Unsigned LONG64 | typedef unsigned __int64 ULONG64 |
WIN64로 넘어가며 WIN32, WIN64에 상관없이 동일한 의미를 지니는 자료형을 표현하기 위해 끝이 32, 64로 끝나는 자료형이 추가됐다.
Windows 스타일 포인터 자료형
| Windows 자료형 | 의미 | 정의 형태 |
|---|---|---|
| PINT | INT32에 대한 포인터 | typedef int* PINT |
| PINT32 | INT32에 대한 포인터 | typedef signed int* PINT32 |
| PINT64 | INT64에 대한 포인터 | typedef signed __int64* PINT64 |
| PLONG | LONG에 대한 포인터 | typedef LONG* PLONG |
| PLONG32 | LONG32에 대한 포인터 | typedef signed int* PLONG32 |
| PLONG64 | LONG64에 대한 포인터 | typedef signed __int* PLONG64 |
| PUINT | UNIT에 대한 포인터 | typedef unsigned int* PUINT |
| PUINT32 | UNIT32에 대한 포인터 | typedef unsigned int* PUINT32 |
| PUINT64 | UNIT64에 대한 포인터 | typedef unsigned __int63* PUINT64 |
| PULONG | ULONG에 대한 포인터 | typedef ULONG* PULONG |
| PULONG32 | ULONG32에 대한 포인터 | typedef unsigned int* PULONG32 |
| PULONG64 | ULONG64에 대한 포인터 | typedef unsigned __int* PULONG64 |
INT_PTR, LONG_PTR
- 32/64bit 시스템에서 동일한 코드로 포인터 조작을 하기 위해 만들어진 자료형이다.
- Polymorphic 자료형이라 한다.
- 이름에 _PTR이 붙었지만 포인터가 아니라 포인터값을 담을 수 있는 자료형이다.
- 32bit에서는 4byte, 64bit에서는 8byte가 된다.
// basetsd.h
#if defined(_WIN64)
typedef __int64 INT_PTR, *PINT_PTR;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef __int64 LONG_PTR, *PLONG_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
#define __int3264 __int64
#else
typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
#define __int3264 __int32
#endif
BOOL 자료형
- C 프로그래밍과 호환성 및 가독성을 위해 윈도우 플랫폼에서 정의한 타입이다.
- int 타입이므로 BOOL이라는 문자의 뜻과 다르게 true, false 두 개의 값이외의 값을 저장할 수있다.
- 따라서 의도치 않은 오류가 날 수 있고 int 타입의 단순 재정의에 불과하기 때문에 컴파일러가 경고해주지도 않는다.
- BOOL 대신 bool을 사용하는 것이 좋다.
참고
-
뇌를 자극하는 윈도우즈 시스템 프로그래밍
-
https://docs.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=vs-2019
-
Windows Data Types https://docs.microsoft.com/en-us/windows/desktop/winprog/windows-data-types
-
https://hoonspace.tistory.com/entry/C-BOOL%EA%B3%BC-bool-%EC%B0%A8%EC%9D%B4