windows 的数据类型

windows 的数据类型


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
to 255
__int16
short, singed short
2
–32,768  to 32,767
unsigned __int16
unsigned short
2
to 65,535
__int32
int, signed int
4
–2,147,483,648  to 2,147,483,647
unsigned __int32
unsigned int
4
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
to 18,446,744,073,709,551,615

在 VC 头文件 limits.h 里定义了 integer 类型的 limit 值:

常量意义
CHAR_BITNumber of bits in the smallest variable that is not a bit field.8
SCHAR_MINMinimum value for a variable of type signed char.–128
SCHAR_MAXMaximum value for a variable of type signed char.127
UCHAR_MAXMaximum value for a variable of type unsigned char.255 (0xff)
CHAR_MINMinimum value for a variable of type char.–128; 0 if /J option used
CHAR_MAXMaximum value for a variable of type char.127; 255 if /J option used
MB_LEN_MAXMaximum number of bytes in a multicharacter constant.5
SHRT_MINMinimum value for a variable of type short.–32768
SHRT_MAXMaximum value for a variable of type short.32767
USHRT_MAXMaximum value for a variable of type unsigned short.65535 (0xffff)
INT_MINMinimum value for a variable of type int.–2147483648
INT_MAXMaximum value for a variable of type int.2147483647
UINT_MAXMaximum value for a variable of type unsigned int.4294967295 (0xffffffff)
LONG_MINMinimum value for a variable of type long.–2147483648
LONG_MAXMaximum value for a variable of type long.2147483647
ULONG_MAXMaximum value for a variable of type unsigned long.4294967295 (0xffffffff)
_I64_MINMinimum value for a variable of type __int64-9223372036854775808
_I64_MAXMaximum value for a variable of type __int649223372036854775807
_UI64_MAXMaximum value for a variable of type unsigned __int6418446744073709551615 (0xffffffffffffffff)

 

2. windows 上的数据类型

windows 自定义了一系列的数据类型,可以说是琳琅满目,甚至可以说混乱

在 MSND 里有一篇介绍 windows 上定义的数据类型:http://msdn.microsoft.com/en-us/library/aa383751(v=VS.85).aspx


2.1 基本数据类型

类型
定义为
宽度
头文件
BOOLtypedef int BOOL;
4
WinDef.h
BOOLEANtypedef BYTE BOOLEAN;
1
WinNT.h
BYTEtypedef unsigned char BYTE;
1
WinDef.h
CHARtypedef char CHAR;
1
WinNT.h
UCHARtypedef unsigned char UCHAR;
1
WinDef.h
SHORTtypedef short SHORT
2
WinNT.h
USHORTtypedef unsigned short USHORT;
2
WinDef.h
WORDtypedef unsinged short WORD;
2
WinDef.h
DWORDtypedef unsigned long DWORD;
4
WinDef.h
DWORD32typedef unsigned int DWORD32;
4
BaseTsd.h
DWORD64typedef unsigned __int64 DWORD64;
8
BaseTsd.h
INTtypedef int INT;
4
WinDef.h
INT32typedef signed int INT32;
4
BaseTsd.h
INT64typedef singed __int64 INT64;
8
BaseTsd.h
UINTtypedef unsigned int UINT;
4
WinDef.h
UINT32typedef unsigned int UINT32;
4
BaseTsd.h
UINT64typedef unsigned __int64 UINT64
8
BaseTsd.h
LONGtypedef long LONG;
4
WinNT.h
LONG32typedef signed int LONG32;
4
BaseTsd.h
LONG64typedef __int64 LONG64;
8
BaseTsd.h
DWORDLONGtypedef ULONGLONG DWORDLONG;
8
WinNT.h
LONGLONGtypedef __int64 LONGLONG;
8
WinNT.h
ULONGtypedef unsigned long ULONG;
4
WinNT.h
ULONG32typedef unsigned int ULONG32;
4
BaseTsd.h
ULONGLONGtypedef unsinged __int64 ULONGLONG;
8
WinNT.h
ULONG64typedef unsigned __int64 ULONG64;
8
BaseTsd.h
FLOATtypedef float FLOAT;
4
WinDef.h

上表所示,对一个类型进行明确的定位,分为 32/64 版本以及 signed/unsinged 版本。它们固定了精度。


2.2 为 UNICODE 准备的数据类型

类型
定义为
宽度
头文件
WCHARtypedef wchat_t WCHAR;
2
WinNT.h
TBYTEtypedef WCHAR TBYTE;
2
WinNT.h
TCHARtypedef WCHAR TCHAR;
2
WinNT.h

TBYTE 和 TCHAR 类型在 WinNT.h 的实际定义为:

#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_PTRtypedef ULONG_PTR DWORD_PTR;
4/8
BaseTsd.h
INT_PTRsizeof(pointer)
4/8
BaseTsd.h
UINT_PTRsizeof(pointer)
4/8
BaseTsd.h
LONG_PTRsizeof(pointer)
4/8
BaseTsd.h
ULONG_PTRsizeof(pointer)
4/8
BaseTsd.h
SIZE_Ttypedef ULONG_PTR SIZE_T;
4/8
BaseTsd.h
SSIZE_Ttypedef LONG_PTR SSIZE_T;
4/8
BaseTsd.h
HALF_PTRsizeof(pointer)/2
2/4
BaseTsd.h
UHALF_PTRsizeof(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 环境下,关键字 _w64 表示:那么它们依赖于 complier 是否开启 /Wp64 编译选项。

如果开启了 /Wp64 选项,这些 XXX_PTR 宽度是 64 位,否则它们是 32 位宽度的,这里有一篇文章分绍 _w64http://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 字符串指针

类型
定义为
头文件
PCHARtypedef CHAR *PCHAR;
WinNT.h
PSTRtypedef __nullterminated CHAR *PSTR;
WinNT.h
PCSTRtypedef __nullterminated CONST CHAR *PCSTR;
WinNT.h
LPSTRtypedef __nullterminated CHAR *LPSTR;
WinNT.h
LPCSTRtypedef __nullterminated CONST CHAR *LPCSTR
WinNT.h

它们都指向 8 bits ANSI 字符串,__nullterminated 是一个编译器使用的 annotation(注解),表示包括 null 字符,也就是以 null 字符结尾的串。

PCHAR 指向字符,PSTR 指向 null 字符结尾的字符串,因此,程序中如果使用 ANSI 字符串的话,应该使用 PSTR 类型。

P 和 LP 都表示指针,实际上它们都是一样的。


2.4.2 UNICODE 字符串指针

类型
定义为
头文件
PWCHARtypedef CHAR *PWCHAR;
WinNT.h
PWSTRtypedef __nullterminated WCHAR *PSTR;
WinNT.h
PCWSTRtypedef __nullterminated CONST WCHAR *PCSTR;
WinNT.h
LPWSTRtypedef __nullterminated WCHAR *LPSTR;
WinNT.h
LPCWSTRtypedef __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 上的各类指针

类型
定义为
头文件
PBOOLtypedef BOOL *PBOOL;
WinDef.h
PBOOLEANtypedef BOOLEAN *PBOOLEAN;
WinNT.h
PBYTEtypedef BYTE *PBYTE;
WinDef.h
PCHARtypedef CHAR *PCHAR;
WinNT.h
PUCHARtypedef UCHAR *PUCHAR;
WinDef.h
PSHORTtypedef SHORT *PSHORT
WinNT.h
PUSHORTtypedef USHORT *PUSHORT;
WinDef.h
PWORDtypedef WORD *PWORD;
WinDef.h
PDWORDtypedef DWORD *PDWORD;
WinDef.h
PDWORD32typedef DOWORD32 *PDWORD32;
BaseTsd.h
PDWORD64typedef DWORD64 *PDWORD64;
BaseTsd.h
PINTtypedef INT *PINT;
WinDef.h
PINT32typedef INT32 *PNT32;
BaseTsd.h
PINT64typedef INT64 *PINT64;
BaseTsd.h
PUINTtypedef UINT *PUINT;
WinDef.h
PUINT32typedef UINT32 *PUINT32;
BaseTsd.h
PUINT64typedef UINT64 *PUINT64
BaseTsd.h
PLONGtypedef LONG *PLONG;
WinNT.h
PLONG32typedef LONG32 *PLONG32;
BaseTsd.h
PLONG64typedef LOGN64 *PLONG64;
BaseTsd.h
PDWORDLONGtypedef DWORDLONG *PDWORDLONG;
WinNT.h
PLONGLONGtypedef LONGLONG *PLONGLONG;
WinNT.h
PULONGtypedef ULONG *PULONG;
WinNT.h
PULONG32typedef ULONG32 *PULONG32;
BaseTsd.h
PULONGLONGtypedef ULONGLONG *PULONGLONG;
WinNT.h
PULONG64typedef ULONG64 *PULONG64;
BaseTsd.h
PFLOATtypedef FLOAT *PFLOAT;
WinDef.h
LPBOOLtypedef BOOL far *LPBOOL;
WinDef.h
LPWORDtypedef WORD *LPWORD;
WinDef.h
LPDWORDtypedef DWORD *LPDWORD;
WinDef.h
LPINTtypedef int *LPINT;
WinDef.h
LPLONGtypedef long *LPLONG;
WinNT.h

上面是对 windows 的基本类型进行指针定义。

 

2.6 VOID 类型

类型
定义为
头文件
VOID#define VOID void
WinNT.h
PVOIDtypedef void *PVOID;
WinNT.h
LPVOIDtypedef void *LPVOID;
WinNT.h
LPCVOIDtypedef CONST void *LPCVOID
WinNT.h

 

2.7 消息类型

类型
定义为
头文件
LPARAMtypedef LONG_PTR LPARAM;
WinDef.h
WPARAMtypedef INT_PTR WPARAM;
WinDef.h
LRESULTtypedef 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 类型

类型
定义为
头文件
HANDLEtypedef PVOID HANDLE;
WinDef.h
HBIMMAPtypedef HANDLE HBITMAP;
WinDef.h
HBRUSHtypedef HANDLE HBRUSH;
WinDef.h
HCOLORSPACEtypedef HANDLE HCOLORSPACE;
WinDef.h
HCONVtypedef HANDLE HCONV;
WinDef.h
HCONVLISTtypedef HANDLE HCONVLIST;
WinDef.h
HCURSORtypedef HANDLE HURSOR;
WinDef.h
HDCtypedef HANDLE HDC;
WinDef.h
HDDEDATAtypedef HANDLEHDDEDATA;
WinDef.h
HDESKtypedef HANDLE HDESK;
WinDef.h
HDROPtypedef HANDLE HDROP;
WinDef.h
HDWPtypedef HANDLE HDWP;
WinDef.h
HENHMETAFILEtypedef HANDLE HENHMETAFILE;
WinDef.h
HFILEtypedef int HFILE;
WinDef.h
HFONTtypedef HANDLE HFONT;
WinDef.h
HGDIOBJtypedef HANDLE HGDIOBJ;
WinDef.h
HGLOBALtypedef HANDLE HGLOBAL;
WinDef.h
HHOOKtypedef HANDLE HHOOK;
WinDef.h
HINSTANCEtypedef HANDLE HINSTANCE;
WinDef.h
HKEYtypedef HANDLE HKEY;
WinDef.h
HKLtypedef HANDLE HKL;
WinDef.h
HLOCALtypedef HANDLE HLOCAL;
WinDef.h
HMENUtypedef HANDLE HMENU;
WinDef.h
HMODULEtypedef HINSTANCE HMODULE;
WinDef.h
HMONITORtypedef HANDLE HMONITOR;
WinDef.h
HPALETTE

typedef HANDLE HPALETTE;

WinDef.h
HPENtypedef HANDLE HPEN;
WinDef.h
HRESULTtypedef LONG HRESULT;
WinNT.h
HRGNtypedef HANDLE HRGN;
WinDef.h
HRSRCtypedef HANDLE HRSRC;
WinDef.h
HWINSTAtypedef HANDLE HWINSTA;
WinDef.h
HWNDtypedef HANDLE HWND;
WinDef.h

HFile 被定义为 singed int 类型,HRESULT 被定义为 LONG

其它的 HANDLE 类型都被定义为 PVOID


版权 mik 所有,转载请注明出处!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值