当前位置:文档之家› C 中各种类型之间的转换

C 中各种类型之间的转换

C  中各种类型之间的转换
C  中各种类型之间的转换

关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast,dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。

static_cast

用法:static_cast(expression_r_r)

该运算符把expression_r_r转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

把空指针转换成目标类型的空指针。

把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expression_r_r的const、volitale、或者__unaligned属性。

dynamic_cast

用法:dynamic_cast(expression_r_r)

该运算符把expression_r_r转换成type-id类型的对象。Type-id 必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression_r_r也必须是一个指针,如果type-id是一个引用,那么expression_r_r也必须是一个引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class B{

public:

int m_iNum;

virtual void foo();

};

class D:public B{

public:

char*m_szName[100];

};

void func(B*pb){

D*pd1=static_cast(pb);

D*pd2=dynamic_cast(pb);

}

在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针。另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。

class A{

public:

int m_iNum;

virtual void f(){}

};

class B:public A{

};

class D:public A{

};

void foo(){

B*pb=new B;

pb->m_iNum=100;

D*pd1=static_cast(pb);//copile error

D*pd2=dynamic_cast(pb);//pd2is NULL

delete pb;

}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用dynamic_cast的转换则是允许的,结果是空指针。

reinpreter_cast

用法:reinpreter_cast(expression_r_r)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

该运算符的用法比较多。

const_cast

用法:const_cast(expression_r_r)

该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外,type_id和expression_r_r的类型是一样的。

常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

Voiatile和const类试。举如下一例:

class B{

public:

int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum=100;//comile error

B b2=const_cast(b1);

b2.m_iNum=200;//fine

}

上面的代码编译时会报错,因为b1是一个常量对象,不能对它进行改变;使用const_cast把它转换成一个常量对象,就可以对它的数据成员任意改变。注意:b1和b2是两个不同的对象。最容易理解的解释:

dynamic_cast:通常在基类和派生类之间转换时使用;const_cast:主要针对const和volatile的转换.

static_cast:一般的转换,如果你不知道该用哪个,就用这个。

reinterpret_cast:用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。

C语言中的整型数据类型转换以及格式化输出问题

C语言中的整型数据类型转换以及格式化输出问题 先附上两张图片 i. Printf()函数的格式转换参数 ii. 各数据类型的长度和表示范围 首先我们来谈整型数据的转换问题,不同类型的整型数据所占的字节数不同,在转换时需要格外留心。 分为两种情况: 第一种情况为将所占字节大的类型数据转换为所占字节小的类型数据,这种情况下只需要截取合适位数的大字节的类型数据到小字节类型数据中即可,例如:unsigned short a=256;char b=a; 则b中的数据为00000000,截取了a的低八位。 第二种情况为将所占字节小的类型数据转换为所占字节大的类型数据,这种情况下需要涉及到扩展问题,所谓扩展分为两种情况,当需要扩展的小类型数据为有符号数时,即将过小数据的最高位即符号位复制到扩展的位上,比如一个char类型的数据char a=128,二进制表示10000000,则将其转换为整型数据b即int b=a,相应的b即为1….10000000,又或者一个char类型数据127,二进制表示01111111,则将其转换为整型数据b相应的b即为0…. 01111111;当需扩展的小类型数据为无符号数时,扩展位为全部为0。 另外对于同等大小的不同数据类型之间转换,则是相应的二进制码全额复制。 下面我们来讨论%d和%u的格式化输出问题 我们都知道%d表示输出十进制有符号整数,然而很少有人会注意到%d表示的格式类型其实相当于int类型,即有符号整型数据,占用4个字节,最高位表示符号位,输出的范围在-2147483648到2147483647间。 当我们在用%d输出数据是需要注意类型间的转换问题的。 不同类型的整型数据所占的字节数不同,在转换时需要格外留心,因为%d表示的4字节数

Java中几种常用的数据类型之间转换方法

Java中几种常用的数据类型之间转换方法:1.短整型-->整型 如: short shortvar=0; int intvar=0; shortvar= (short) intvar 2.整型-->短整型 如: short shortvar=0; int intvar=0; intvar=shortvar; 3.整型->字符串型 如: int intvar=1; String stringvar; Stringvar=string.valueOf (intvar); 4.浮点型->字符串型 如: float floatvar=9.99f; String stringvar; Stringvar=String.valueOf (floatvar); 5.双精度型->字符串型 如: double doublevar=99999999.99; String stringvar; Stringvar=String.valueOf (doublevar); 6. 字符型->字符串型 如:char charvar=’a’; String stringvar;

Stringvar=String.valueOf (charvar); 7字符串型->整型、浮点型、长整型、双精度型如:String intstring=”10”; String floatstring=”10.1f”; String longstring=”99999999”; String doubleString=”99999999.9”; Int I=Integer.parseInt (intstring); Float f= Integer.parseInt (floatstring); Long lo=long. parseInt (longstring); Double d=double. parseInt (doublestring); 8字符串型->字节型、短整型 如:String s=”0”; Byte b=Integer.intValue(s); Short sh=Integer.intValue(s); 9字符串型->字符型 如: String s=”abc”; Char a=s.charAt(0); 10字符串型-->布尔型 String s=”true”; Boolean flag=Boolean.valueOf (“s”);

c各种数据类型之间相互转化

⑴. char *转换到BSTR BSTR b = _com_util::ConvertStringToBSTR("数据"); SysFreeString(bstrValue); (2).BSTR转换到char* char *p=_com_util::ConvertBSTRToString(b); delete p; 12.typedef和typename要害字 这两个要害字在运用的时辰时例会令人迷惑,其实很简单,typedef是类型定义, 而typename是类型解释2009年04月20日 类型转换是将一种类型的值映射为另一种类型的值进行数据类型的转换 是在实际代码编写中经常遇到的问题,出格是字符串和其它类型的转换 1.将字符串转换为整儿 (1).转换函数 // 双精度函数 double atof( const char *string ); double _wtof( const wchar_t *string ); 自适应 TCHAR:_tstof 、_ttof VS2005:_atof_l 、_wtof_l 、_atodbl 、_atodbl_l // 整型函数 int atoi( const char *string ); _int64 _atoi64( const char *string ); int _wtoi( const wchar_t *string ); _int64 _ wtoi64( const char *string ); 自适应 TCHAR:_tstoi 、_ttoi 、_tstoi64 、_ttoi64 VS2005:_atoi_l 、_wtoi_l 、_atoi64_l 、_wtoi64_l //长整形函数 long atol( const char * string ); long _wtol(

C语言数据类型与表达式习题及答案

第一章数据类型,运算符与表达式 一.选择题 1.不合法的常量是A。 A)‘/2’B) “”C)‘’D)“483” 2. B 是C语言提供的合法的数据类型关键字。 A)Float B)signed C)integer D)Char 3.在以下各组标识符中,合法的标识符是(1)A,(2) C ,(3) D 。 (1)A)B01 B)table_1 C)0_t D)k% Int t*.1 W10 point (2)A)Fast_ B)void C)pbl D) Fast+Big abs fabs beep (3)A)xy_ B)longdouble C)*p D)CHAR 变量1 signed history Flaut 4. 不属于合法的C语言长整型常量的是 C 。 A)5876273 B)0L C)2E10 D)(long)5876273 7.下面选项中,均是合法浮点数的是 B 。 A)+1e+1 B)-0.60 C)123e D)-e3 5e-9.4 12e-4 1.2e-.4 .8e-4 03e2 -8e5 +2e-1 5.e-0 8.在C语言中,要求参加运算的数必须是整数的运算符是 C 。 A)/ B)* C)% D) = 9.在C语言中,字符型数据在内存中以 D 形式存放。 A)原码B)BCD码C)反码D)ASCII码10.下列语句中,符合语法的赋值语句是 C 。 A)a=7+b+c=a+7;B)a=7+b++=a+7; C)a=7+b,b++,a+7;D)a=7+b = c=a+7; 11. B 是非法的C语言转义字符。 A)‘\b’B)‘\0xf’C)‘\037’D)‘\’’12.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中, B 是正确的。 A)语法错误B)f为5.0 C)f为0.0 D)f为2.0 13.与代数式x y u v ? ? 不等价的C语言表达式是A。 A)x*y/u*v B)x*y/u/v C)x*y/(u*v) D)x/(u*v)*y 14.在C语言中,数字029是一个 D 。 A)八进制数B)十六进制数C)十进制数D)非法数 16.对于char cx=?\039?;语句,正确的是A。 A)不合法B)cx的值是?\03? C)cx的值为四个字符D)cx的值为三个字符 17.若int k=7,x=12;则能使值为3的表达式是 D 。 A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 18.为了计算s=10!(即10的阶乘),则s变量应定义为 C 。 A)int B)unsigned C)long D)以上三种类型均可

C语言数据类型及转换

C语言的数据类型 C语言提供的数据结构,是以数据类型形式出现的。具体分类如下: 1.基本类型 分为整型、实型(又称浮点型)、字符型和枚举型四种。 2.构造类型 分为数组类型、结构类型和共用类型三种。 3.指针类型。在第9章中介绍。 4.空类型 C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。 本章将介绍基本类型中的整型、实型和字符型三种数据。 2.3 常量和变量 2.3.1 常量 1.常量的概念 在程序运行过程中,其值不能被改变的量称为常量。 2.常量的分类 (1)整型常量 (2)实型常量 (3)字符常量。 (4)符号常量。 常量的类型,可通过书写形式来判别。 2.3.2 变量 1.变量的概念 在程序运行过程中,其值可以被改变的量称为变量。 2.变量的两个要素 (1)变量名。每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。(2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。 3.标识符命名规则 (1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。 (2)有效长度:随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。 例如,由于student_name和student_number的前8个字符相同,有的系统认为这两个变量,是一回事而不加区别。 在TC V2.0中,变量名(标识符)的有效长度为1~32个字符,缺省值为32。 (3)C语言的关键字不能用作变量名。 注意:C语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。 习惯上,变量名和函数名中的英文字母用小写,以增加可读性。 思考题:在C语言中,变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗?标识符命名的良好习惯──见名知意: 所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。 例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。 4.变量的定义与初始化 在C语言中,要求对所有用到的变量,必须先定义、后使用;且称在定义变量的同时进行赋初值的操作为变量初始化。

数据类型转换

数据类型转换 各类整数之间的转换 C语言中的数分8位、16位和32位三种。属于8 位数的有:带符号 字符char,无符号字符unsigned char 。属于16位数的有:带符号整 数int,无符号整数unsigned int(或简写为unsigned),近指针。属 于32位数的有:带符号长整数long,无符号长整数 unsigned long, 远指针。 IBM PC是16位机,基本运算是16位的运算,所以,当8位数和16 位数进行比较或其它运算时,都是首先把8 位数转换成16位数。为了 便于按2的补码法则进行运算,有符号8位数在转换为16位时是在左边 添加8个符号位,无符号8位数则是在左边添加8个0。当由16位转换成 8位时,无论什么情况一律只是简单地裁取低8位,抛掉高8 位。没有 char或usigned char常数。字符常数,像"C",是转换为int以后存储 的。当字符转换为其它 16 位数(如近指针)时,是首先把字符转换为 int,然后再进行转换。 16位数与32位数之间的转换也遵守同样的规则。 注意,Turbo C中的输入/输出函数对其参数中的int和unsigned int不加区分。例如,在printf函数中如果格式说明是%d 则对这两种 类型的参数一律按2 的补码(即按有符号数)进行解释,然后以十进制 形式输出。如果格式说明是%u、%o、%x、%X,则对这两种类型的参数 一律按二进制 (即按无符号数) 进行解释,然后以相应形式输出。在 scanf函数中,仅当输入的字符串中含有负号时,才按2的补码对输入 数进行解释。 还应注意,对于常数,如果不加L,则Turbo C一般按int型处理。 例如,语句printf("%081x",-1L),则会输出ffffffff。如果省略1, 则输出常数的低字,即ffff。如果省略L,则仍会去找1个双字,这个 双字的就是int常数-1,高字内容是不确定的,输出效果将是在4个乱 七八糟的字符之后再跟ffff。 在Turbo C的头文件value.h中,相应于3 个带符号数的最大值, 定义了3个符号常数: #define MAXSHORT 0X7FFF #define MAXINT 0X7FFF #define MAXLONG 0X7FFFFFFFL 在Turbo C Tools中,包括3对宏,分别把8位拆成高4位和低4位, 把16位拆成高8位和低8位,把32位拆成高16位和低16位。 uthinyb(char value) utlonyb(char value) uthibyte(int value) utlobyte(int value) uthiword(long value) utloword(long valueu) 在Turbo C Tools中,也包括相反的3 个宏,它们把两个4位组成 一个8位,把两个8位组成一个16位,把两个16位组成一个32位。 utnybbyt(HiNyb,LoNyb) utwdlong(HiWord,Loword) utbyword(HiByte,LoByte)实数与整数之间的转换 Turbo C中提供了两种实数:float和 double。float 由32 位组 成,由高到低依次是:1个尾数符号位,8个偏码表示的指数位(偏值= 127),23个尾数位。double由64位组成,由高到低依次是:1 个尾数

C语言各种数值类型转换

C语言数据类型转换1 CString,int,string,char*之间的转换 string 转CString CString.format("%s", string.c_str()); char 转CString CString.format("%s", char*); char 转string string s(char *); string 转char * const char *p = string.c_str(); CString 转string string s(CString.GetBuffer()); 1,string -> CString CString.format("%s", string.c_str()); 用c_str()确实比data()要好. 2,char -> string string s(char *); 你的只能初始化,在不是初始化的地方最好还是用assign(). 3,CString -> string string s(CString.GetBuffer()); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. 《C++标准函数库》中说的 有三个函数可以将字符串的内容转换为字符数组和C—string 1.data(),返回没有”\0“的字符串数组 2,c_str(),返回有”\0“的字符串数组 3,copy() CString互转int 将字符转换为整数,可以使用atoi、_atoi64或atol。 而将数字转换为CString变量,可以使用CString的Format函数。如 CString s; int i = 64; s.Format("%d", i) Format函数的功能很强,值得你研究一下。

c语言的基本数据类型及其表示

3.2 C语言的基本数据类型及其表示 C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。 3.2.1 常量与变量 1. 常量 常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对 象之一。C语言提供的常量有: 以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大小和数的表示范围。在C程序中,常量是直接以自身的存在形式体现其值和类型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-32768~32767;123.0是实型常量,占四个存储字节,数的表示范围是-3.4 10-38~3.4 1038。 需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。 2.符号常量 在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现,直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可修改性和灵活性。因此,C语言中提供了一种符号常量,即用指定的标识符来表示某个常量,在程序中需要使用该常量时就可直接引用标识符。 C语言中用宏定义命令对符号常量进行定义,其定义形式如下: #define 标识符常量 其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表实型常量3.1415927,用W代表字符串常量"Windows 98",可用下面两个宏定义命令: #define PAI 3.1415927

C语言各种数值类型转换函数

C语言各种数值类型转换函数 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) strtoul(将字符串转换成无符号长整型数) toascii(将整型数转换成合法的ASCII 码字符) toupper(将小写字母转换成大写字母) tolower(将大写字母转换成小写字母) atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。 返回值返回转换后的浮点型数。 附加说明 atof()与使用strtod(nptr,(char**)NULL)结果相同。 范例 /* 将字符串a 与字符串b转换成数字后相加*/ #include main() { char *a=”-100.23”; char *b=”200e-2”; float c; c=atof(a)+atof(b); printf(“c=%.2f\n”,c); } 执行 c=-98.23 atoi(将字符串转换成整型数) 相关函数 atof,atol,atrtod,strtol,strtoul 表头文件 #include 定义函数 int atoi(const char *nptr); 函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('\0')才结束转换,并将结果返回。 返回值返回转换后的整型数。 附加说明 atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。 范例 /* 将字符串a 与字符串b转换成数字后相加*/

最新C语言数据类型及转换

C语言数据类型及转 换

C语言的数据类型 C语言提供的数据结构,是以数据类型形式出现的。具体分类如下:1.基本类型 分为整型、实型(又称浮点型)、字符型和枚举型四种。 2.构造类型 分为数组类型、结构类型和共用类型三种。 3.指针类型。在第9章中介绍。 4.空类型 C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。本章将介绍基本类型中的整型、实型和字符型三种数据。 2.3 常量和变量 2.3.1 常量 1.常量的概念 在程序运行过程中,其值不能被改变的量称为常量。 2.常量的分类 (1)整型常量 (2)实型常量 (3)字符常量。 (4)符号常量。 常量的类型,可通过书写形式来判别。 2.3.2 变量 1.变量的概念

在程序运行过程中,其值可以被改变的量称为变量。 2.变量的两个要素 (1)变量名。每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。 (2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。 3.标识符命名规则 (1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。(2)有效长度:随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。 例如,由于student_name和student_number的前8个字符相同,有的系统认为这两个变量,是一回事而不加区别。 在TC V2.0中,变量名(标识符)的有效长度为1~32个字符,缺省值为32。 (3)C语言的关键字不能用作变量名。 注意:C语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。 习惯上,变量名和函数名中的英文字母用小写,以增加可读性。 思考题:在C语言中,变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗? 标识符命名的良好习惯──见名知意:

vba中数据类型转换

类型转换函数 请参阅示例特性 每个函数都可以强制将一个表达式转换成某种特定数据类型。语法 CBool(expression) CByte(expression) CCur(expression) CDate(expression) CDbl(expression) CDec(expression) CInt(expression) CLng(expression) CLngLng(expression)(只在 64 位平台上有效。) CLngPtr(expression) CSng(expression) CStr(expression) CVar(expression) CStr(expression) 必要的expression参数可以是任何字符串表达式或数值表达式。返回类型 函数名称决定返回类型,如下所示:

函数返回类型expression参数范围

CBool Boolean任何有效的字符串或数值表达式。 CByte Byte0 至 255。 CCur Currency-922,337,203,685,477.5808 至 922,337,203,685,477.5807。 CDate Date任何有效的日期表达式。 CDbl Double 负数从 -1.79769313486231E308 至 -4.94065645841247E-324;正数从 4.94065645841247E-324 至 1.79769313486232E308。 CDec Decimal零变比数值,即无小数位数值,为 +/-79,228,162,514,264,337,593,543,950,335。 对于 28 位小数的数值,范围则为 +/-7.9228162514264337593543950335;最小的可 能非零值是 0.0000000000000000000000000001。CInt Integer-32,768 至 32,767,小数部分四舍五入。 CLng Long-2,147,483,648 至 2,147,483,647,小数部分四 舍五入。 CLngLng LongLong-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807;小数部分四舍五入。 (只在 64 位平台上有效。) CLngPtr LongPtr在 32 位系统上,为 -2,147,483,648 到 2,147,483,647;在 64 位系统上,为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807;对于 32 位和 64 位系统,小数部分四舍五入。 CSng Single负数为 -3.402823E38 至 -1.401298E-45;正数为 1.401298E-45 至 3.402823E38。 CStr String依据expression 参数返回 Cstr。 CVar Variant若为数值,则范围与Double 相同;若不为数值, 则范围与String 相同。

C语言隐式类型转换规则_(比较实用)

C语言隐式类型转换规则 C语言规定,不同类型的数据需要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间通过类型转换便可以进行混合运算(但不是所有类型之间都可以进行转换) .当混合不同类型的变量进行计算时,便可能会发生类型转换 相同类型的数据在转换时有规则可循: 字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) short型转换为int型(同属于整型) float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 赋值时,一律是右部值转换为左部类型 [注] 当整型数据和双精度数据进行运算时,C先将整型数据转换成双精度型数据,再进行运算,结果为双精度类型数据 当字符型数据和实型数据进行运算时,C先将字符型数据转换成实型数据,然后进行计算,结果为实型数据 2.4 数据类型转换在C语言的表达式中,准许对不同类型的数值型数据进行某一操作或混合运算。当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作。数据类型转换有两种形式,即隐式类型转换和显示类型转换。 2.4.1 隐式类型转换所谓隐式类型转换就是在编译时由编译程序按照一定规则自动完成,而不需人为干预。因此,在表达式中如果有不同类型的数据参与同一运算时,编译器就在编译时自动按照规定的规则将其转换为相同的数据类型。 C语言规定的转换规则是由低级向高级转换。例如,如果一个操作符带有两个类型不同的操作数时,那么在操作之前行先将较低的类型转换为较高的类型,然后进行运算,运算结果是较高的类型。更确切地说,对于每一个算术运算符,则遵循图2-2所示的规则。

图2-2 数据类型转换规则之一 注意:在表达式中,所有的float类型都转换为double型以提高运算精度。 在赋值语句中,如果赋值号左右两端的类型不同,则将赋值号右边的值转换为赋值号左边的类型,其结果类型还是左边类型。 因为函数参数是表达式,因此,当参数传递给函数时,也发生类型转换。具体地说,char和short均转换为int;float转换为double。这就是为什么我们把函数参数说明为int和double,尽管调用函数时用char 和float . 也可以将图2-2所示的规则用图2-3表示。图2-3中的水平箭头表示必定转换,纵向箭头表示两个操作对象类型不同时的转换方向。 图2-3 数据类型转换规则之二 下面举行说明类型转换的规则。例如执行:

c里的数据类型转换

●字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待,取值范围总是0~255)。 ●如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。 double ←── float 高 ↑ long ↑ unsigned ↑ int ←── char,short 低 ●图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double 型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。 ●当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,而较高类型的数据转换为较低类型时则可能有些数据丢失。 赋值中的类型转换 当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下: (1) 浮点型与整型 ●将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。 将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。 (2) 单、双精度浮点型 ●由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。 (3) char型与int型 ● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。 ● chr型数值赋给int型变量时,一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值,只是数据的内部表示形式有所不同。 (4) int型与1ong型 ● long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。 将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。 (5) 无符号整数 ●将一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照赋,内部的存储方式不变,但外部值却可能改变。

C语言中强制类型转换总结

C语言中强制类型转换总结 ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待,取值范围总是0~255)。 ● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。 double ←── float 高 ↑ long ↑ unsigned ↑ in t ←── char,short 低 ● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int 型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,c语言也提供了以显式

的形式强制转换类型的机制。 ● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,而较高类型的数据转换为较低类型时则可能有些数据丢失。 赋值中的类型转换 当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下: (1) 浮点型与整型 ● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。 将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。 (2) 单、双精度浮点型 ● 由于c语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。 (3) char型与int型 ● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。 ● chr型数值赋给int型变量时,一些编译程序不管其值大小都作

C语言程序设计(数据类型的转换)

2.1.1数据类型的转换 当运算符两侧操作数的数据类型不同时,它们会按照提升规则自动进行类型转换,使二者具有同一类型,然后再进行运算。转换的规则见图2-2。图2-2中横向向左的箭头表示必定的转换,如字符型 (char)数据和短整型(short)必定先转换成整型(int),单精 度浮点型(float)必定先转换为双精度浮点型(double),以 提高运算精度。 图2-2中纵向的箭头表示当运算符两侧操作数的数据 类型不同时自动转换的方向。数据总是由低级别向高级别转 换,例如,一个int 型数据与一个double 型数据进行运算, 则先将int 型直接转换为double 型然后在两个同类型(double)数据之间进行运算;如果一个int 型与一个long 型数据进行运算,则将int 型转换为long 型再进行运算。 在进行赋值运算时也发生类型转换,右侧的值转换为左侧的值。如,x 为float 型,i 为int 型,当进行x=i 和i=x 赋值操作时会引起类型转换。转换是按如下规则进行的: (1)char 型转换为int 型时没有变化。 (2)long 型转换为short 型或char 型时,截掉多余的高位信息。 (3)float,double 型转换为int 型时,小数部分会被截掉。 在任何表达式中都可以强制类型进行转换。其形式为: (类型名)表达式 例如,库函数sqrt 需要一个double 型的参数,如果n 是一个整型数,我们可以使用sqrt((double)n)把n 的值转换为double 型。注意,在强制类型转换时,得到了一个所需类型的中间变量,原来变量n 的类型并未发生变化。例如,有程序片断: float x; int i;x = 3.6; i =(int)x; printf("x=%f,i=%d\n",x ,i); 运行结果如下: x=3.600000,i=3 x 的类型仍为float,值仍等于3.6。 总之,在程序设计中,表达式的应用应注意两点,首先如何将代数式表示成正确的表达式,其次是考虑运算符的优先级、结合性及参与运算的数据类型的逐步转换问题。double←float ↑long ↑unsigned ↑int←char,short 图2-2数据类型转换图低高

C语言中强制类型转换总结

C语言中强制类型转换总结 1.自动类型转换 ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待, 取值范围总是0~255)。 ● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。 double ←── float 高 ↑ long ↑ unsigned ↑ int ←── char,short 低 ● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C 语言也提供了以显式的形式强制转换类型的机制。 ● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。 2.赋值中的类型转换 当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下: (1) 浮点型与整型 ● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。 将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。 (2) 单、双精度浮点型 ● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。 (3) char型与int型 ● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。 ● chr型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同。 (4) int型与1ong型 ● long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。

C有关数据类型转换大全

C++有关数据类型转换大全 来源:中国自学编程网发布日期:2007-05-21 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: 0 decimal表示小数点的位置,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);

C数据类型转换及操作

void foo(void) { unsigned int a = 6; int b = -20; (a+b > 6) puts("> 6") : puts("<= 6"); } C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘 在汇编语言层面,声明变量的时候,没有signed 和unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,db -20 汇编后为:EC ,而db 236 汇编后也为EC 。这里有一个小问题,思考深入的朋友会发现,db 是分配一个字节,那么一个字节能表示的有符号整数范围是:-128 ~ +127 ,那么db 236 超过了这一范围,怎么可以?是的,+236 的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00 EC,也就是说+236的补码应该是00 EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后汇编的结果被截断了,00 EC 是两个字节,被截断成EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把236 当作无符号数时,它汇编后的结果正好也是EC ,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如-20 那么汇编后的结果是符合有符号数的;如果你输入236 那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果是符合无符号数的。于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。其实,你们被骗了。:-) 3.第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:mul div movzx … 是处理无符号数的,而这些:imul idiv movsx … 是处理有符号的。 举例来说: 内存里有一个字节x 为:0x EC ,一个字节y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。下面进

相关主题
文本预览
相关文档 最新文档