转自: 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
本文详细介绍了Visual C/C++和Windows平台上的数据类型,包括整数类型、基本数据类型、指针精度、字符串类型等,并解释了不同类型的定义、宽度及使用场景。

被折叠的 条评论
为什么被折叠?



