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

合集下载

VC 中类型转换(CString,TCHAR,string)

VC 中类型转换(CString,TCHAR,string)
本主题演示如何将各种 C++ 字符串类型转换为其他字符串。可以转换的字符串类型包括 char *、wchar_t*、_bstr_t、CComBSTR、CString、basic_string 和 System.String。在所有情况下,在将字符串转换为新类型时,都会创建字符串的副本。对新字符串进行的任何更改都不会影响原始字符串,反之亦然。
AfxMessageBox(buf);
delete(buf);
_bstr_t变量
_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
_bstr_t bstrVar("test");
const char *buf = bstrVar;///不要修改buf中的内容
AfxMessageBox(buf);
buffer = _fcvt( source, 7, &decimal, &sign );
运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小数点的位置,sign表示符号:0为正数,1为负数
CString变量
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include <comdef.h>
例如:
long l=222;
特别是_bstr_t,建议大家使用它。

VC6里用到的一些类型转换

VC6里用到的一些类型转换

VC6里用到的一些类型转换[引子]在做毕设的时候,用到VC6里面的串口控件。

我对VC几乎是一窍不通的,这次做毕设里面的类型转换也困扰了我好久。

在此小小总结一下。

[主要内容]一、MSComm里用到的VARIANT, COleVariant类型与CString, BYTE之间的转换,以实现数据的发送和接收二、CString与int的转换,实现对接收来的数据的运算一、MSComm和VARIANTVC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。

这两个函数的参数都是VARIANT类型。

void CMSComm::SetOutput(const VARIANT& newValue)VARIANT CMSComm::GetInput()发送过程:VARIANT其实是一个C++结构类型,COleVariant类型对VARIANT做了进一步的封装和扩展,提供了许多新的功能和操作方法,支持OLE自动化,且更容易向其数据成员填入数据。

由于COleVariant类型由VARIANT派生而来,因此将COleVariant类型的变量传递给SetOutput函数更为方便。

另外,SetOutput的参数newValue类型必须是存放字节类型数据的动态数组。

因此,可以利用Visual C++提供CByteArray类型来构造COleVariant类型的对象,并将其传递给SetOutput函数。

对CByteArray类型变量的操作相对来说要容易的多,比如其成员函数SetSize可用来设置动态数组的大小,下标操作符[]可用来为其元素赋值等等。

下面的程序代码可实现将存放在缓冲区strBuf中的100个字节的数据通过通讯控件发送出去:……BYTE strBuf[128];CByteArray OutBuf;COleVariant varOutput;……OutBuf.SetSize(100);for(i=0;i<100;i++)OutBuf[i] = strBuf[i];//BYTE转CByteArrayvarOutput = OutBuf;//CByteArray转COleVariantm_pCommDlg->m_Comm.SetOutput(varOutput);……利用通讯控件发送数据的关键在于构造COleVariant类型的变量,并向其中填入通讯数据,使其能满足通讯控件的成员函数SetOutput 的需要。

强制转换数据类型c语言

强制转换数据类型c语言

强制转换数据类型c语言在C语言中,强制转换数据类型是一种常见且重要的操作。

当我们需要将一个数据类型转换为另一个数据类型时,就需要使用强制转换操作符。

强制转换可以帮助我们在需要时将数据类型转换为另一种数据类型,以满足特定的需求。

在C语言中,强制转换的语法如下:(目标数据类型) 表达式其中,目标数据类型表示需要转换的目标数据类型,表达式表示需要转换的表达式或变量。

下面我们来看几种常见的强制转换数据类型的情况:1. 将整数转换为浮点数:当我们需要将整数转换为浮点数时,可以使用强制转换操作符。

例如,我们有一个整数变量a,我们想将其转换为浮点数,可以这样做:float b = (float)a;这样就可以将整数a转换为浮点数b。

2. 将浮点数转换为整数:同样,当我们需要将浮点数转换为整数时,也可以使用强制转换操作符。

例如,我们有一个浮点数变量c,我们想将其转换为整数,可以这样做:int d = (int)c;这样就可以将浮点数c转换为整数d。

需要注意的是,强制转换会截断小数部分,只保留整数部分。

3. 将字符转换为整数:在C语言中,字符类型实际上是整数类型的一种,可以将字符转换为整数。

例如,我们有一个字符变量ch,我们想将其转换为整数,可以这样做:int num = (int)ch;这样就可以将字符ch转换为整数num,实际上是将字符的ASCII码转换为整数。

4. 将指针转换为整数:在C语言中,可以将指针转换为整数类型,这在某些情况下是有用的。

例如,我们有一个指针变量ptr,我们想将其转换为整数,可以这样做:int num = (int)ptr;这样就可以将指针ptr转换为整数num,但需要注意的是,指针转换为整数可能会丢失指针的信息,不建议经常使用。

总的来说,强制转换数据类型是C语言中的一种重要操作,可以帮助我们在需要时转换数据类型,但需要注意转换的合法性,避免数据丢失或错误转换的情况发生。

在使用强制转换时,需要注意转换的目的和转换的方式,确保转换的正确性和安全性。

c语言不同数据类型间的混合运算转换规则+常见数据类型

c语言不同数据类型间的混合运算转换规则+常见数据类型

c语言不同数据类型间的混合运算转换规则+常见数据类型C语言中,不同数据类型之间的混合运算会按照一定的规则进行自动转换,具体规则如下:1. 整数和浮点数运算:- 如果一个操作数是浮点数,那么另一个操作数也会被转换为浮点数,然后进行运算。

- 如果一个操作数是整数,而另一个操作数是浮点数,那么整数会自动转换为浮点数,然后进行运算。

2. 整数之间的运算:- 如果两个操作数的类型相同,那么不需要进行任何转换,直接进行运算。

- 如果两个操作数的类型不同,那么会将较低精度的操作数自动提升为较高精度的类型,然后再进行运算。

常见的C语言数据类型包括:1. 整数类型:- char:1字节,有符号或无符号的整数。

- short:2字节,有符号或无符号的短整数。

- int:2或4字节,有符号或无符号的整数。

在不同系统中,其长度可能会有所不同。

- long:4或8字节,有符号或无符号的长整数。

在不同系统中,其长度可能会有所不同。

2. 浮点数类型:- float:4字节,单精度浮点数。

- double:8字节,双精度浮点数。

- long double:8字节以上,长双精度浮点数。

3. 其他类型:- void:空类型,用于标识无返回值或不可具体化的函数。

- bool(C99标准引入):用于表示布尔值,取值为true或false。

- 数组类型、指针类型、结构体类型、枚举类型等。

需要注意的是,在进行混合运算时,应尽量避免不必要的类型转换,以免影响程序的可读性和正确性。

同时,对于可能引起精度丢失的情况(如整数与浮点数之间的运算),需注意选择合适的数据类型和进行必要的类型转换。

vc常用数据及其转换

vc常用数据及其转换

一、常用数据类型列表VC常用数据类型列表(1)VC常用数据类型列表(2)VC常用数据类型列表(3)同时,为了统一变量的命名,在Windows中,不同类型的变量拥有各自的标准前缀,一般情况如表所示。

不同数据类型的前缀前缀数据类型c 字符(char)s 短整数(short)cb 用于定义对象(一般为一个结构)尺寸的整数n 整数(integer)sz 以'\0'结尾的字符串b 字节f BOOLw 字(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[]="";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与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。

VC类型格式转换

VC类型格式转换

项目中经常用到各种不同的语言的朋友们应该会比较有这样的体会:一种开发语言用了比较长的时间,突然间转到另外一种语言的话,不管是数据类型或者语法结构,多多少少都会有那么一点不适应。

哪怕MFC中的类型与标准C++也是一样的。

下面是MFC/C++/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的。

1、CString,int,string,char*之间的转换string转CStringCString.format("%s", string.c_str());char转CStringCString.format("%s", char*);char转stringstring s(char *);string转char *char *p = string.c_str();// CString转std::stringCStringstr = dlg.GetPathName(); setlocale(LC_ALL, "chs");char *p = new char[256];wcstombs( p, str, 256 );m_fileName = p;1,string ->CStringCString.format("%s", string.c_str());用c_str()确实比data()要好. 2,char -> stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign(). 3,CString -> string string s(CString.GetBuffer()); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.《C++标准函数库》中说的有三个函数可以将字符串的内容转换为字符数组和C—string1.data(),返回没有“\0”的字符串数组2,c_str(),返回有“\0”的字符串数组3,copy()CString互转int将字符转换为整数,可以使用atoi、_atoi64或atol。

VC常用数据类型总结

VC常用数据类型总结

VC常用数据类型总结VC(Visual C++)常用数据类型指的是在C++编程中经常使用的数据类型。

根据数据类型的特性和用途不同,VC常用数据类型可以分为以下几类:1. 基本数据类型(Primitive Data Types):- 整型(Integer Type):用于表示整数,包括有符号整数(signed)和无符号整数(unsigned),例如int、short、long、char等。

- 浮点型(Floating-Point Type):用于表示带小数点的数值,包括单精度浮点型(float)和双精度浮点型(double)。

- 字符型(Character Type):用于表示单个字符,例如char类型。

- 布尔型(Boolean Type):用于表示真(true)或假(false),例如bool类型。

2. 高级数据类型(Advanced Data Types):- 数组(Array):用于存储多个相同类型的元素,例如int数组、char数组等。

- 结构体(Structure):用于封装多个不同类型的变量,例如定义一个包含姓名、年龄等信息的Student结构体。

- 枚举(Enumeration):用于定义一组相关的常量,例如定义星期几的枚举类型。

3. 指针(Pointer):- 指针(Pointer):保存变量的内存地址,可以通过指针间接访问变量的值,例如int*指针。

- 空指针(Null Pointer):指向无效内存地址的指针,通常表示指针未初始化或指向不存在的对象。

- 空指针常量(Null Pointer Constant):表示空指针的特殊值,通常用NULL或nullptr表示。

4. 自定义数据类型(User-Defined Data Types):- 类(Class):用于创建自定义的数据类型,包含数据成员和成员函数。

- 模板(Template):用于创建通用的数据类型,支持不特定的数据类型参数,例如STL容器类(vector、list等)的模板类型。

C语言数据类型转换

C语言数据类型转换

1.自动类型转换自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

1)将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:float f = 100;100是int类型的数据,需要先转换为float类型才能赋值给变量f。

再如:int n = f;f是float类型的数据,需要先转换为int类型才能赋值给变量n。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。

对于不安全的类型转换,编译器一般会给出警告。

2)在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。

转换的规则如下:●转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。

例如,int和long参与运算时,先把int类型的数据转成long类型后再进行运算。

●所有的浮点运算都是以双精度进行的,即使运算中只有float类型,也要先转换为double类型,才能进行运算。

●char和short参与运算时,必须先转换成int类型。

下图对这种转换规则进行了更加形象地描述:unsigned也即unsigned int,此时可以省略int,只写unsigned。

自动类型转换示例:#include<stdio.h>int main(){float PI = 3.14159;int s1, r = 5;double s2;s1 = r * r * PI;s2 = r * r * PI;printf("s1=%d, s2=%f\n", s1, s2);return 0;}运行结果:s1=78, s2=78.539749在计算表达式r*r*PI时,r和PI都被转换成double类型,表达式的结果也是double类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

介绍一些常用数据类型的使用。

先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="张三";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);浮点数(float,double)用fcvt可以完成转换,这是MSDN中的例子:int decimal, sign;char *buffer;double source = 3.1415926535;buffer = _fcvt( source, 7, &decimal, &sign );运行结果:source: 3.1415926535 buffer: '31415927'decimal: 1 sign: 0decimal表示小数点的位置,sign表示符号:0为正数,1为负数CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str;BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员"); char * buf =_com_util::ConvertBSTRToString(bstrValue); SysFreeString(bstrValue);AfxMessageBox(buf);delete(buf);CComBSTR变量CComBSTR bstrVar("test");char *buf =_com_util::ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf);delete(buf);_bstr_t变量_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用_bstr_t bstrVar("test");const char *buf = bstrVar;///不要修改buf中的内容 AfxMessageBox(buf);通用方法(针对非COM数据类型)用sprintf完成转换char buffer[200];char c = '1';int i = 35;long j = 1000;float f = 1.7320534f;sprintf( buffer, "%c",c);sprintf( buffer, "%d",i);sprintf( buffer, "%d",j);sprintf( buffer, "%f",f);二、字符串转换为其它数据类型strcpy(temp,"123");短整型(int)i = atoi(temp);长整型(long)l = atol(temp);浮点(double)d = atof(temp);CString变量CString name = temp;BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员");...///完成对bstrValue的使用SysFreeString(bstrValue);CComBSTR变量CComBSTR类型变量可以直接赋值CComBSTR bstrVar1("test");CComBSTR bstrVar2(temp);_bstr_t变量_bstr_t类型的变量可以直接赋值_bstr_t bstrVar1("test");_bstr_t bstrVar2(temp);三、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)str.Format("%d",i);浮点数(float)str.Format("%f",i);字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值str = username;对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。

四、BSTR、_bstr_t与CComBSTRCComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。

char *转换到BSTR可以这样:BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.libSysFreeString(bstrValue);反之可以使用char *p=_com_util::ConvertBSTRToString(b);delete p;具体可以参考一,二段落里的具体说明。

CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。

特别是_bstr_t,建议大家使用它。

五、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。

对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:Byte 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.DECIMAL FAR* pdecVal// VT_BYREF|VT_DECIMAL.IUnknown FAR* punkVal;// VT_UNKNOWN.IDispatch FAR*// VT_DISPATCH. pdispVal;SAFEARRAY FAR* parray;// VT_ARRAY|*.Byte 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*// VT_BYREF|VT_BOOL. pboolVal;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*// VT_BYREF|VT_UNKNOWN. ppunkVal;IDispatch FAR* FAR*// VT_BYREF|VT_DISPATCH. ppdispVal;SAFEARRAY FAR* FAR*// VT_ARRAY|*.pparray;VARIANT FAR* pvarVal;// VT_BYREF|VT_VARIANT.void FAR* byref;// Generic ByRef.char cVal;// VT_I1.unsigned short uiVal;// VT_UI2.unsigned long ulVal;// VT_UI4.int intVal;// VT_INT.unsigned int uintVal;// VT_UINT.char FAR * pcVal;// VT_BYREF|VT_I1.unsigned short FAR *// VT_BYREF|VT_UI2.puiVal;unsigned long FAR *// VT_BYREF|VT_UI4.pulVal;int FAR * pintVal;// VT_BYREF|VT_INT.unsigned int FAR *//VT_BYREF|VT_UINT.puintVal;_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

使用时需加上#include <comdef.h>例如: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;六、其它一些COM数据类型根据ProgID得到CLSIDHRESULT CLSIDFromProgID( LPCOLESTRlpszProgID,LPCLSID pclsid);CLSID clsid;CLSIDFromProgID( L"MAPI.Folder",&clsid);根据CLSID得到ProgIDWINOLEAPI ProgIDFromCLSID( REFCLSIDclsid,LPOLESTR * lplpszProgID);例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgIDLPOLESTR pProgID = 0;ProgIDFromCLSID( CLSID_IApplication,&pProgID);...///可以使用pProgIDCoTaskMemFree(pProgID);//不要忘记释放七、ANSI与UnicodeUnicode称为宽字符型字串,COM里使用的都是Unicode字符串。

相关文档
最新文档