转自: http://www.mouseos.com/win64/data_type.html
1. Visual C/C++ 数据类型
Visual c/c++ 支持下列几个 integer 类型:
- __int8
- __int16
- __int32
- __int64
它们分别对应于 ANSI C 的:
- char
- short
- int
- long long
Visual C/C++ 支持 bool 类型,并且增加了:
- wchat_t (或者 _wchat_t )
这个类型 2 bytes 宽,用来表示 wide-character 或者 multibyte character,在字符前加上前缀 L 来表示 wide-character,如:
- 'a' --- ANSI character
- L'a' --- wide character
上面分别是字符 'a' 的 ANSI 版本和 wide 版本,wchar_t 的意义是 unsigned short
对于每个 integer 类型都分别有 signed 和 unsigned 版本,缺省情况下是 signed 的
VC/C++ 类型
|
对应于
|
字节数
|
表达范围
|
__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 上的数据类型
windows 自定义了一系列的数据类型,可以说是琳琅满目,甚至可以说混乱
在 MSND 里有一篇介绍 windows 上定义的数据类型:http://msdn.microsoft.com/en-us/library/aa383751(v=VS.85).aspx
2.1 基本数据类型
类型
|
定义为
|
宽度
|
头文件
|
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
|
上表所示,对一个类型进行明确的定位,分为 32/64 版本以及 signed/unsinged 版本。它们固定了精度。
2.2 为 UNICODE 准备的数据类型
类型
|
定义为
|
宽度
|
头文件
|
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 的实际定义为:
#ifdef UNICODE #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED #else #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED #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 LONG_PTR , *PLONG_PTR; #define __int3264 __int64 #else typedef _W64 long LONG_PTR , *PLONG_PTR; #define __int3264 __int32 #endi |
在 WIN64 下它们的 __int64 类型,指示 64 位的 pointer 宽度。
_W64 被定义为 _w64 ,如果不在 WIN64 环境下,关键字 _w64 表示:那么它们依赖于 complier 是否开启 /Wp64 编译选项。
如果开启了 /Wp64 选项,这些 XXX _PTR 宽度是 64 位,否则它们是 32 位宽度的,这里有一篇文章分绍 _w64 : http://msdn.microsoft.com/en-us/library/s04b5w00.aspx
2.4 windows 上的字符串
在 windows 上使用两种类型的字符串:
- ANSI 字符串
- UNICODE 字符串
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 是一个编译器使用的 annotation(注解),表示包括 null 字符,也就是以 null 字符结尾的串。
PCHAR 指向字符,PSTR 指向 null 字符结尾的字符串,因此,程序中如果使用 ANSI 字符串的话,应该使用 PSTR 类型。
P 和 LP 都表示指针,实际上它们都是一样的。
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 字符结尾的 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 时,它们指向 CHAR 字符串(各种类型)
因此在我们的程序中应该尽量使用 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 的基本类型进行指针定义。
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
|
这两个消息的参数类型是指针的精度,在 x86 上是 32 位,在 WIN64 下是 64 位。
LRESULT 类型用于消息过程的返回值,在 WIN64 下是 64 位。
2.8 调用约定
类型
|
定义为
|
头文件
|
WINAPI | #define WINAPI __stdcall |
WinDef.h
|
APIENTRY | #define APIENTRY WINAPI |
WinDef.h
|
CALLBACK | #define CALLBACK __stdcall |
WinDef.h
|
这三种调用约定在 x86 平台下都是定义为 __stdcall 调用约定
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
转自: http://www.mouseos.com/win64/data_type.html