【转帖】VC常用数据类型及使用转换详解

 

VC常用数据类型及使用转换详解

 

一、常用数据类型列表

VC常用数据类型列表(1)

 

Type

Default Size

Description

 

说明:这些基础数据类型对于MFC还是API都是被支持的

boolean

unsigned 8 bit ,

取值TRUE/FALSE

byte

unsigned 8 bit,

整数,输出按字符输出

char

unsigned 8 bit,

字符

double

signed 64 bit

浮点型

float

signed32 bit

浮点型

handle_t

Primitive handle type

hyper

signed 64 bit

整型

int

signed 32 bit

整型

long

signed 32 bit

整型

short

signed 16 bit

整型

small

signed 8 bit

整型

void *

32-bit

指向未知类型的指针

wchar_t

unsigned 16 bit

16位字符,比char可容纳更多的字符

 

 

VC常用数据类型列表(2)

Win32

API

 

说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型,

BOOL/BOOLEAN

8bit,TRUE/FALSE

布尔变量,实际上是16位UINT

BYTE

unsigned 8 bit

 8位无符号整数

BSTR

CComBSTR

_bstr_t

32 bit

BSTR是指向字符串的32位指针

是对BSTR的封装

是对BSTR的封装

CHAR

8 bit

(ANSI)字符类型

COLORREF

32 bit

RGB颜色值索引 整型

DWORD

unsigned 32 bit

整型

FLOAT

float型

float型

HANDLE

32位的无符号整数,用作Windows系统所建立的某个对象的句柄,使该句柄就相当于引用该对象。

HBITMAP

bitmap句柄

HBRUSH

brush句柄

HCURSOR

cursor句柄

HDC

设备上下文句柄

HFILE

OpenFile打开的File句柄

HFONT

font句柄

HHOOK

hook句柄

HKEY

注册表键句柄

HPEN

pen句柄

HWND

32位的无符号整数,用作窗口句柄,使该句柄就相当于引用该窗口。

 

HINSTANCE

 

32位的无符号整数,用作实例句柄

 

VC常用数据类型列表(3)

INT

--------

--------

UINT

 

定义一个新的Win32数据类型,它会把一个参数强制转换成Windows3.x应用中的16位值或Win32应用中的32位值

LONG

--------

32位带符号整数

LONGLONG

64位带符号整型

LPARAM

32 bit

消息参数

LPBOOL

BOOL型指针

LPBYTE

BYTE型指针

LPCOLOREF

COLORREF型指针

LPCSTR/LPSTR/PCSTR

指向8位(ANSI)字符串类型指针

LPCWSTR/LPWSTR/PCWSTR

指向16位Unicode字符串类型

LPCTSTR/LPTSTR/PCTSTR

指向一8位或16位字符串类型指针

LPSTR

 

一个32位,指向字符(字符串)数据的指针

LPVOID

指向一个未指定类型的32位指针

LPDWORD

指向一个DWORD型指针

其他相似类型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT

PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……

说明:(1)在16位系统中 LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)

(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE

SHORT

usigned

整型

其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型

TBYTE

WCHAR型或者CHAR型

TCHAR

ANSI与unicode均可

VARIANT

_variant_t

COleVariant

一个结构体参考OAIDL.H

_variant_t是VARIANT的封装类

COleVariant也是VARIANT的封装类

FARPROC

 

 指向函数的32位指针

WNDPROC

指向一个窗口过程的32位指针

WCHAR

16位Unicode字符型

WORD

16位无符号整型

LOWORD

 

取一个32位整数的低16位,并应强制转换为short int。

WPARAM

消息参数

SIZE_T

 

size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的 位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。 一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技术手册。

MFC

独有

数据

类型

下面两个数据类型是微软基础类库中独有的数据类型

POSITION

标记集合中一个元素的位置的值,被MFC中的集合类所使用

LPCRECT

指向一个RECT结构体常量(不能修改)的32位指针

CString

其实是MFC中的一个类

    

同时,为了统一变量的命名,在Windows中,不同类型的变量拥有各自的标准前缀,一般情况如表所示。

不同数据类型的前缀

前缀 数据类型

c 字符(char)

s 短整数(short)

cb 用于定义对象(一般为一个结构)尺寸的整数

n 整数(integer)

sz 以'/0'结尾的字符串

b 字节

f BOOL

w 字(WORD,无符号短整数)

l 长整数(LONG)

h HANDLE(无符号整数)

m_ 类成员变量

fn 函数(function)

dw 双字(DWORD,无符号长整数)

 

二、数据类型转换:

刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100;

long l = 2001;

float f=300.2;

double d=12345.119;

char username[]="www.handytech.cn";

char temp[200];

char *buf;

CString str;

_variant_t v1;

_bstr_t v2;

 

一、其它数据类型转换为字符串

短整型(int)

itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制

itoa(i,temp,2); ///按二进制方式转换

长整型(long)

ltoa(l,temp,10);

 

二、从其它包含字符串的变量中获取指向该字符串的指针

CString变量

str = "2008北京奥运";

buf = (LPSTR)(LPCTSTR)str;

BSTR类型的_variant_t变量

v1 = (_bstr_t)"程序员";

buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

 

三、字符串转换为其它数据类型

strcpy(temp,"123");

 

短整型(int)

i = atoi(temp);

长整型(long)

l = atol(temp);

浮点(double)

d = atof(temp);

 

四、其它数据类型转换到CString

使用CString的成员函数Format来转换,例如:

整数(int)

str.Format("%d",i);

浮点数(float)

str.Format("%f",i);

字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值

str = username;

 

五、BSTR、_bstr_t与CComBSTR

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。

char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h

反之可以使用char *p=_com_util::ConvertBSTRToString(b);

 

六、VARIANT 、_variant_t 与 COleVariant

VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。

对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:

VARIANT va;

int a=2001;

va.vt=VT_I4;///指明整型数据

va.lVal=a; ///赋值

 

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

 

unsigned char bVal; VT_UI1

short iVal; VT_I2

long lVal;VT_I4

float fltVal;VT_R4

double dblVal;VT_R8

VARIANT_BOOL boolVal;VT_BOOL

SCODE scode;VT_ERROR

CY cyVal;VT_CY

DATE date;VT_DATE

BSTR bstrVal;VT_BSTR

IUnknown FAR* punkVal;VT_UNKNOWN

IDispatch FAR* pdispVal;VT_DISPATCH

SAFEARRAY FAR* parray;VT_ARRAY|*

unsigned char FAR* pbVal;VT_BYREF|VT_UI1

short FAR* piVal;VT_BYREF|VT_I2

long FAR* plVal;VT_BYREF|VT_I4

float FAR* pfltVal;VT_BYREF|VT_R4

double FAR* pdblVal; VT_BYREF|VT_R8

VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL

SCODE FAR* pscode;VT_BYREF|VT_ERROR

CY FAR* pcyVal;VT_BYREF|VT_CY

DATE FAR* pdate; VT_BYREF|VT_DATE

BSTR FAR* pbstrVal;VT_BYREF|VT_BSTR

IUnknown FAR* FAR* ppunkVal;VT_BYREF|VT_UNKNOWN

IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH

SAFEARRAY FAR* FAR* pparray;VT_ARRAY|*

VARIANT FAR* pvarVal;VT_BYREF|VT_VARIANT

void FAR* byref;VT_BYREF

 

 

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

例如:

long l=222;

ing i=100;

_variant_t lVal(l);

lVal = (long)i;

 

 

COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:

COleVariant v3 = "字符串", v4 = (long)1999;

CString str =(BSTR)v3.pbstrVal;

long i = v4.lVal;

 

 

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:

LPARAM lParam;

WORD lovalue = LOWORD(lParam);///取低16位

WORD hivalue = HIWORD(lParam);///取高16位

对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:

WORD wvalue;

BYTE lovalue = LOBYTE(wvalue);///取低8位

BYTE hivalue = HIBYTE(wvalue);///取高8位

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值