FW: Windows 的数据类型

 

转自: 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 __int649223372036854775807
_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
       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 环境下,关键字 _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 类型。

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

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值