windows 的數(shù)據(jù)類型
1. Visual C/C++ 數(shù)據(jù)類型
Visual c/c++ 支持下列幾個(gè) integer 類型:
- __int8
- __int16
- __int32
- __int64
它們分別對應(yīng)于 ANSI C 的:
Visual C/C++ 支持 bool 類型,并且增加了:
這個(gè)類型 2 bytes 寬,,用來表示 wide-character 或者 multibyte character,,在字符前加上前綴 L 來表示 wide-character,如:
- 'a' --- ANSI character
- L'a' --- wide character
上面分別是字符 'a' 的 ANSI 版本和 wide 版本,,wchar_t 的意義是 unsigned short
對于每個(gè) integer 類型都分別有 signed 和 unsigned 版本,,缺省情況下是 signed 的
VC/C++ 類型 |
對應(yīng)于 |
字節(jié)數(shù) |
表達(dá)范圍 |
__int8 |
char, signed char |
1 |
–128 to 127 |
unsigned __int8 |
unsigned char |
1 |
0 to 255 |
__int16 |
short, singed short |
2 |
–32,768 to 32,767 |
unsigned __int16 |
unsigned short |
2 |
0 to 65,535 |
__int32 |
int, signed int |
4 |
–2,147,483,648 to 2,147,483,647 |
unsigned __int32 |
unsigned int |
4 |
0 to 4,294,967,295 |
__int64 |
long long, signed long long |
8 |
–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
unsigned __int64 |
unsigned long long |
8 |
0 to 18,446,744,073,709,551,615 |
在 VC 頭文件 limits.h 里定義了 integer 類型的 limit 值:
常量 |
意義 |
值 |
CHAR_BIT |
Number of bits in the smallest variable that is not a bit field. |
8 |
SCHAR_MIN |
Minimum value for a variable of type signed char. |
–128 |
SCHAR_MAX |
Maximum value for a variable of type signed char. |
127 |
UCHAR_MAX |
Maximum value for a variable of type unsigned char. |
255 (0xff) |
CHAR_MIN |
Minimum value for a variable of type char. |
–128; 0 if /J option used |
CHAR_MAX |
Maximum value for a variable of type char. |
127; 255 if /J option used |
MB_LEN_MAX |
Maximum number of bytes in a multicharacter constant. |
5 |
SHRT_MIN |
Minimum value for a variable of type short. |
–32768 |
SHRT_MAX |
Maximum value for a variable of type short. |
32767 |
USHRT_MAX |
Maximum value for a variable of type unsigned short. |
65535 (0xffff) |
INT_MIN |
Minimum value for a variable of type int. |
–2147483648 |
INT_MAX |
Maximum value for a variable of type int. |
2147483647 |
UINT_MAX |
Maximum value for a variable of type unsigned int. |
4294967295 (0xffffffff) |
LONG_MIN |
Minimum value for a variable of type long. |
–2147483648 |
LONG_MAX |
Maximum value for a variable of type long. |
2147483647 |
ULONG_MAX |
Maximum value for a variable of type unsigned long. |
4294967295 (0xffffffff) |
_I64_MIN |
Minimum value for a variable of type __int64 |
-9223372036854775808 |
_I64_MAX |
Maximum value for a variable of type __int64 |
9223372036854775807 |
_UI64_MAX |
Maximum value for a variable of type unsigned __int64 |
18446744073709551615 (0xffffffffffffffff) |
2. windows 上的數(shù)據(jù)類型
windows 自定義了一系列的數(shù)據(jù)類型,可以說是琳瑯滿目,,甚至可以說混亂
在 MSND 里有一篇介紹 windows 上定義的數(shù)據(jù)類型:http://msdn.microsoft.com/en-us/library/aa383751(v=VS.85).aspx
2.1 基本數(shù)據(jù)類型
類型 |
定義為 |
寬度 |
頭文件 |
BOOL |
typedef int BOOL; |
4 |
WinDef.h |
BOOLEAN |
typedef BYTE BOOLEAN; |
1 |
WinNT.h |
BYTE |
typedef unsigned char BYTE; |
1 |
WinDef.h |
CHAR |
typedef char CHAR; |
1 |
WinNT.h |
UCHAR |
typedef unsigned char UCHAR; |
1 |
WinDef.h |
SHORT |
typedef short SHORT |
2 |
WinNT.h |
USHORT |
typedef unsigned short USHORT; |
2 |
WinDef.h |
WORD |
typedef unsinged short WORD; |
2 |
WinDef.h |
DWORD |
typedef unsigned long DWORD; |
4 |
WinDef.h |
DWORD32 |
typedef unsigned int DWORD32; |
4 |
BaseTsd.h |
DWORD64 |
typedef unsigned __int64 DWORD64; |
8 |
BaseTsd.h |
INT |
typedef int INT; |
4 |
WinDef.h |
INT32 |
typedef signed int INT32; |
4 |
BaseTsd.h |
INT64 |
typedef singed __int64 INT64; |
8 |
BaseTsd.h |
UINT |
typedef unsigned int UINT; |
4 |
WinDef.h |
UINT32 |
typedef unsigned int UINT32; |
4 |
BaseTsd.h |
UINT64 |
typedef unsigned __int64 UINT64 |
8 |
BaseTsd.h |
LONG |
typedef long LONG; |
4 |
WinNT.h |
LONG32 |
typedef signed int LONG32; |
4 |
BaseTsd.h |
LONG64 |
typedef __int64 LONG64; |
8 |
BaseTsd.h |
DWORDLONG |
typedef ULONGLONG DWORDLONG; |
8 |
WinNT.h |
LONGLONG |
typedef __int64 LONGLONG; |
8 |
WinNT.h |
ULONG |
typedef unsigned long ULONG; |
4 |
WinNT.h |
ULONG32 |
typedef unsigned int ULONG32; |
4 |
BaseTsd.h |
ULONGLONG |
typedef unsinged __int64 ULONGLONG; |
8 |
WinNT.h |
ULONG64 |
typedef unsigned __int64 ULONG64; |
8 |
BaseTsd.h |
FLOAT |
typedef float FLOAT; |
4 |
WinDef.h |
上表所示,,對一個(gè)類型進(jìn)行明確的定位,分為 32/64 版本以及 signed/unsinged 版本,。它們固定了精度,。
2.2 為 UNICODE 準(zhǔn)備的數(shù)據(jù)類型
類型 |
定義為 |
寬度 |
頭文件 |
WCHAR |
typedef wchat_t WCHAR; |
2 |
WinNT.h |
TBYTE |
typedef WCHAR TBYTE; |
2 |
WinNT.h |
TCHAR |
typedef WCHAR TCHAR; |
2 |
WinNT.h |
TBYTE 和 TCHAR 類型在 WinNT.h 的實(shí)際定義為:
#ifdef UNICODE
#ifndef _TCHAR_DEFINED typedef WCHAR TCHAR, *PTCHAR; typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED #endif
#else
#ifndef _TCHAR_DEFINED typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED #endif
#endif /* UNICODE */ |
如果定義了 UNICODE 的話,TCHAR 和 TBYTE 就是 WCHAR 類型,,否則它們是 char/unsigned char 類型,。
因此:TCHAR 和 TBYTE 是中立的字符類型,依賴于 UNICODE 是否定義,。
2.3 指針精度
類型 |
定義為 |
寬度 |
頭文件 |
DWORD_PTR |
typedef ULONG_PTR DWORD_PTR; |
4/8 |
BaseTsd.h |
INT_PTR |
sizeof(pointer) |
4/8 |
BaseTsd.h |
UINT_PTR |
sizeof(pointer) |
4/8 |
BaseTsd.h |
LONG_PTR |
sizeof(pointer) |
4/8 |
BaseTsd.h |
ULONG_PTR |
sizeof(pointer) |
4/8 |
BaseTsd.h |
SIZE_T |
typedef ULONG_PTR SIZE_T; |
4/8 |
BaseTsd.h |
SSIZE_T |
typedef LONG_PTR SSIZE_T; |
4/8 |
BaseTsd.h |
HALF_PTR |
sizeof(pointer)/2 |
2/4 |
BaseTsd.h |
UHALF_PTR |
sizeof(pointer)/2 |
2/4 |
BaseTsd.h |
sizeof(pointer) 意思是類型的寬度依賴于 pointer 的寬度,,有 32/64 位寬度。
在 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
#endi |
在 WIN64 下它們的 __int64 類型,,指示 64 位的 pointer 寬度,。
_W64 被定義為 _w64,如果不在 WIN64 環(huán)境下,,關(guān)鍵字 _w64 表示:那么它們依賴于 complier 是否開啟 /Wp64 編譯選項(xiàng),。
如果開啟了 /Wp64 選項(xiàng),這些 XXX_PTR 寬度是 64 位,,否則它們是 32 位寬度的,,這里有一篇文章分紹 _w64: http://msdn.microsoft.com/en-us/library/s04b5w00.aspx
2.4 windows 上的字符串
在 windows 上使用兩種類型的字符串:
ANSI 字符串是 8 bits 的 char 類型字符串,UNICODE 字符串是 16 bits 的 wchar_t 類型字符串,。
2.4.1 ANSI 字符串指針
類型 |
定義為 |
頭文件 |
PCHAR |
typedef CHAR *PCHAR; |
WinNT.h |
PSTR |
typedef __nullterminated CHAR *PSTR; |
WinNT.h |
PCSTR |
typedef __nullterminated CONST CHAR *PCSTR; |
WinNT.h |
LPSTR |
typedef __nullterminated CHAR *LPSTR; |
WinNT.h |
LPCSTR |
typedef __nullterminated CONST CHAR *LPCSTR |
WinNT.h |
它們都指向 8 bits ANSI 字符串,,__nullterminated 是一個(gè)編譯器使用的 annotation(注解),表示包括 null 字符,,也就是以 null 字符結(jié)尾的串,。
PCHAR 指向字符,PSTR 指向 null 字符結(jié)尾的字符串,,因此,,程序中如果使用 ANSI 字符串的話,應(yīng)該使用 PSTR 類型。
P 和 LP 都表示指針,,實(shí)際上它們都是一樣的,。
2.4.2 UNICODE 字符串指針
類型 |
定義為 |
頭文件 |
PWCHAR |
typedef CHAR *PWCHAR; |
WinNT.h |
PWSTR |
typedef __nullterminated WCHAR *PSTR; |
WinNT.h |
PCWSTR |
typedef __nullterminated CONST WCHAR *PCSTR; |
WinNT.h |
LPWSTR |
typedef __nullterminated WCHAR *LPSTR; |
WinNT.h |
LPCWSTR |
typedef __nullterminated CONST WCHAR *LPCSTR |
WinNT.h |
PWCHAR 指向 WCHAR 字符,其它都是指向 16 bits 的以 null 字符結(jié)尾的 Wide 字符串,。情形和 ANSI 字符串一樣,。
2.4.3 中立的字符串指針
類型 |
定義為 |
頭文件 |
PTCHAR |
依賴于是否定義 UNICODE |
WinNT.h |
PTSTR |
依賴于是否定義 UNICODE |
WinNT.h |
PCTSTR |
依賴于是否定義 UNICODE |
WinNT.h |
LPTSTR |
依賴于是否定義 UNICODE |
WinNT.h |
LPCTSTR |
依賴于是否定義 UNICODE |
WinNT.h |
這些 TCHAR 類型的字符串指針類型依賴于是否定義了 UNICODE 宏:
- 在定義了 UNICODE 的情況下,它們指向 WCHAR 字符串(各種類型)
- 未定義 UNICODE 時(shí),,它們指向 CHAR 字符串(各種類型)
因此在我們的程序中應(yīng)該盡量使用 TCHAR 類型的指針,,以保持中立性。
2.5 windows 上的各類指針
類型 |
定義為 |
頭文件 |
PBOOL |
typedef BOOL *PBOOL; |
WinDef.h |
PBOOLEAN |
typedef BOOLEAN *PBOOLEAN; |
WinNT.h |
PBYTE |
typedef BYTE *PBYTE; |
WinDef.h |
PCHAR |
typedef CHAR *PCHAR; |
WinNT.h |
PUCHAR |
typedef UCHAR *PUCHAR; |
WinDef.h |
PSHORT |
typedef SHORT *PSHORT |
WinNT.h |
PUSHORT |
typedef USHORT *PUSHORT; |
WinDef.h |
PWORD |
typedef WORD *PWORD; |
WinDef.h |
PDWORD |
typedef DWORD *PDWORD; |
WinDef.h |
PDWORD32 |
typedef DOWORD32 *PDWORD32; |
BaseTsd.h |
PDWORD64 |
typedef DWORD64 *PDWORD64; |
BaseTsd.h |
PINT |
typedef INT *PINT; |
WinDef.h |
PINT32 |
typedef INT32 *PNT32; |
BaseTsd.h |
PINT64 |
typedef INT64 *PINT64; |
BaseTsd.h |
PUINT |
typedef UINT *PUINT; |
WinDef.h |
PUINT32 |
typedef UINT32 *PUINT32; |
BaseTsd.h |
PUINT64 |
typedef UINT64 *PUINT64 |
BaseTsd.h |
PLONG |
typedef LONG *PLONG; |
WinNT.h |
PLONG32 |
typedef LONG32 *PLONG32; |
BaseTsd.h |
PLONG64 |
typedef LOGN64 *PLONG64; |
BaseTsd.h |
PDWORDLONG |
typedef DWORDLONG *PDWORDLONG; |
WinNT.h |
PLONGLONG |
typedef LONGLONG *PLONGLONG; |
WinNT.h |
PULONG |
typedef ULONG *PULONG; |
WinNT.h |
PULONG32 |
typedef ULONG32 *PULONG32; |
BaseTsd.h |
PULONGLONG |
typedef ULONGLONG *PULONGLONG; |
WinNT.h |
PULONG64 |
typedef ULONG64 *PULONG64; |
BaseTsd.h |
PFLOAT |
typedef FLOAT *PFLOAT; |
WinDef.h |
LPBOOL |
typedef BOOL far *LPBOOL; |
WinDef.h |
LPWORD |
typedef WORD *LPWORD; |
WinDef.h |
LPDWORD |
typedef DWORD *LPDWORD; |
WinDef.h |
LPINT |
typedef int *LPINT; |
WinDef.h |
LPLONG |
typedef long *LPLONG; |
WinNT.h |
上面是對 windows 的基本類型進(jìn)行指針定義,。
2.6 VOID 類型
類型 |
定義為 |
頭文件 |
VOID |
#define VOID void |
WinNT.h |
PVOID |
typedef void *PVOID; |
WinNT.h |
LPVOID |
typedef void *LPVOID; |
WinNT.h |
LPCVOID |
typedef CONST void *LPCVOID |
WinNT.h |
2.7 消息類型
類型 |
定義為 |
頭文件 |
LPARAM |
typedef LONG_PTR LPARAM; |
WinDef.h |
WPARAM |
typedef INT_PTR WPARAM; |
WinDef.h |
LRESULT |
typedef LONG_PTR LRESULT; |
WinDef.h |
這兩個(gè)消息的參數(shù)類型是指針的精度,,在 x86 上是 32 位,在 WIN64 下是 64 位,。
LRESULT 類型用于消息過程的返回值,,在 WIN64 下是 64 位。
2.8 調(diào)用約定
類型 |
定義為 |
頭文件 |
WINAPI |
#define WINAPI __stdcall |
WinDef.h |
APIENTRY |
#define APIENTRY WINAPI |
WinDef.h |
CALLBACK |
#define CALLBACK __stdcall |
WinDef.h |
這三種調(diào)用約定在 x86 平臺(tái)下都是定義為 __stdcall 調(diào)用約定
2.9 Windows 的 Handle 類型
類型 |
定義為 |
頭文件 |
HANDLE |
typedef PVOID HANDLE; |
WinDef.h |
HBIMMAP |
typedef HANDLE HBITMAP; |
WinDef.h |
HBRUSH |
typedef HANDLE HBRUSH; |
WinDef.h |
HCOLORSPACE |
typedef HANDLE HCOLORSPACE; |
WinDef.h |
HCONV |
typedef HANDLE HCONV; |
WinDef.h |
HCONVLIST |
typedef HANDLE HCONVLIST; |
WinDef.h |
HCURSOR |
typedef HANDLE HURSOR; |
WinDef.h |
HDC |
typedef HANDLE HDC; |
WinDef.h |
HDDEDATA |
typedef HANDLEHDDEDATA; |
WinDef.h |
HDESK |
typedef HANDLE HDESK; |
WinDef.h |
HDROP |
typedef HANDLE HDROP; |
WinDef.h |
HDWP |
typedef HANDLE HDWP; |
WinDef.h |
HENHMETAFILE |
typedef HANDLE HENHMETAFILE; |
WinDef.h |
HFILE |
typedef int HFILE; |
WinDef.h |
HFONT |
typedef HANDLE HFONT; |
WinDef.h |
HGDIOBJ |
typedef HANDLE HGDIOBJ; |
WinDef.h |
HGLOBAL |
typedef HANDLE HGLOBAL; |
WinDef.h |
HHOOK |
typedef HANDLE HHOOK; |
WinDef.h |
HINSTANCE |
typedef HANDLE HINSTANCE; |
WinDef.h |
HKEY |
typedef HANDLE HKEY; |
WinDef.h |
HKL |
typedef HANDLE HKL; |
WinDef.h |
HLOCAL |
typedef HANDLE HLOCAL; |
WinDef.h |
HMENU |
typedef HANDLE HMENU; |
WinDef.h |
HMODULE |
typedef HINSTANCE HMODULE; |
WinDef.h |
HMONITOR |
typedef HANDLE HMONITOR; |
WinDef.h |
HPALETTE |
typedef HANDLE HPALETTE; |
WinDef.h |
HPEN |
typedef HANDLE HPEN; |
WinDef.h |
HRESULT |
typedef LONG HRESULT; |
WinNT.h |
HRGN |
typedef HANDLE HRGN; |
WinDef.h |
HRSRC |
typedef HANDLE HRSRC; |
WinDef.h |
HWINSTA |
typedef HANDLE HWINSTA; |
WinDef.h |
HWND |
typedef HANDLE HWND; |
WinDef.h |
HFile 被定義為 singed int 類型,,HRESULT 被定義為 LONG
其它的 HANDLE 類型都被定義為 PVOID
版權(quán) mik 所有,,轉(zhuǎn)載請注明出處!
|