第2章 数据类型与运算符(4)

2020-02-21 22:45

博学谷——让IT教学更简单,让IT学习更有效

2.3.4 数据类型的转换

在C语言程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。C语言程序中的类型转换可分为隐式和强制类型转换两种,具体如下:

1、隐式类型转换

隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 (1)算术转换:

进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同一类型的数据才能运算。算术转换原则为: ① 对于所有比int小的类型,包括char、unsigned char、short、unsigned short,首先会提升为int类型。 ② 在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如:

? 若运算数中有double型或float型,则其他类型数据均转换成double类型进行运算。 ? 若运算数中最长的类型为long型.则其他类型数均转换成long型数。 ? 若运算数中最长类型为int型,则char型也转换成int型进行运算。 特别注意的是有符号和无符号之间的转换:

long与unsigned int在32位机器上都是4字节,所以均转换为unsigned long。signed与unsigned int,signed会转换为unsigned。如果int恰好为负数,其结果为对unsigned取值求模的结果。比如将-1赋给8位的unsigned char,那么结果就是255(-1对256取模后的值)。unsigned char取值范围0~255。

(2)赋值转换:

进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。 下面用实例进行说明:

char ch; int i, result; float f; double d;

result=ch/i+(f*d-i);

① 首先计算“ch/i”,因为变量i是int型,所以变量ch转换为int型,“ch/i”返回int型结果。

② 接着计算“f*d-i”,由于最长型为double型(变量d),故变量f转换为double型,变量i转换为double型,“f*d-i”的结果也转换为double

型。

③ “ch/i”和“f*d-i”进行加运算,由于“f*d-i”的返回值为double型,故“ch/i”的返回值也转换为double型,“ch/i+(f*d-i)”的返回值是

double型。

④ 由于result为int型,故“ch/i+(f*d-i)”的返回值由double型转换为int型,即进行截断与舍入,最后取值为整型。 (3)输出转换:

在程序中将数据用printf()函数以指定格式输出时,当要输出的数据类型与输出格式不符时,便自动进行类型转换,如一个整(int)型数据用字符(char)型格式(%c)输出时,相当于将int型转换成char型数据输出;一个字符(char)型数据用整(int)型格式输出时,相当于将char型转换成int型输出。

需要注意的是,较长型数据转换成短型数据输出时,其值不能超出短型数据允许的值范围,否则转换时将出错,例如:

16

博学谷——让IT教学更简单,让IT学习更有效

int a=321; printf(\

运行结果为“A”,因为char型允许的最大值为255,321超出此值,故结果取以256为模的余数,即进行取余运算:321%6=65,而65正是字符“A”的ASCII码。

输出的数据类型与输出格式不符时常常发生错误,如:

int d=9; printf(\

float c=3.2; printf(\

2、显式类型转换

显式类型转换又称为强制类型转换,所谓显式类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换有可能会造成数据的精度丢失,其基本语法格式如下所示:

(类型名)(表达式)

在上述格式中,类型名和表达式都需要用括号括起来,具体示例如下:

double x; int y;

(double)((int)x + y) // 将表达式x+y的值转换成double类型 (int)x+y

// 将变量x的值转换成int后,再与y相加

上述讲解的两种类型转换,看起来很简单,但在使用时有许多细节需要注意,具体如下: (1)浮点型与整型

将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。需要注意的是,赋值时的类型转换实际上是强制的。 (2)单、双精度浮点型

由于C语言中的浮点值总是用双精度表示的,所以float 型数据参与运算时只需要在尾部加0延长为double型数据。double型数据转换为float型时,会造成数据精度丢失,有效位以外的数据将会进行四舍五入。 (3)char型与int型

将int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

将char型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时会根据char型数据值的大小进行判断,若值大于127,就作为负数处理。对于使用者来讲,如果原来char型数据取正值,转换后仍为正值。如果原来char型值可正可负,则转换后也仍然保持原值,只是数据的内部表示形式有所不同。 (4)int型与long型

long型数据赋给int型变量时,将低16位值送给int型变量,而将高16位截断舍弃。(这里假定int型占两个字节)。将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。 (5)无符号整数

将一个unsigned型数据赋给一个长度相同的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short),内部的存储方式不变,但外部值却可能改变。

17

博学谷——让IT教学更简单,让IT学习更有效

将一个非unsigned整型数据赋给一个长度相同的unsigned型变量时,内部存储形式不变,但外部表示时总是无符号的。 为了帮助大家更好地学习类型转换,接下来通过一个案例进行一些简单的算术,具体如例2-8所示。 例2-8

1 #include 2 void main() 3 { 4 5 6 7 8 9 }

float a = 11, b; int c = 2, d; b = a / c; d = (int)b;

printf(\

运行结果如图2-14所示。

图2-14 运行结果

从图2-14中可以看出,变量b和d的值并不一样。程序在执行“a / c”时,因为变量a的类型是float型,而变量c的类型是int型,所以先将c的类型转换成float型,再进行计算,最终返回的结果是float类型的数值5.5,最后把该结果赋值给变量b;程序执行“d = (int)b”语句时,因为变量b的类型是float型,所以在被强制转换成int型时,将小数部分舍去,返回int型值5,最后把该结果赋值给变量d。

2.4 运算符

运算符是编程语言中不可或缺的一部分,用于对一个或多个值(表达式)进行运算。本节将针对C语言中的常见运算符进行详细地讲解。

2.4.1 运算符与表达式

在应用程序中,经常会对数据进行运算,为此,C语言提供了多种类型的运算符,即专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将C语言中常见的运算符分为以下几类,具体如表2-9所示。

表2-9

运算符类型 算术运算符 赋值运算符 关系运算符 逻辑运算符 三目运算符 逗号运算符 位运算符 sizeof运算符 用于处理四则运算 用于将表达式的值赋给变量 用于表达式的比较,并返回一个真值或假值 用于根据表达式的值返回真值或假值 用于根据表达式的值执行相应的语句 用于连接并执行若干表达式,并返回最后一个表达式的值 用于处理数据的位运算 用于求字节数长度 常见的运算符类型及其作用

作用 表2-9列举了C语言中常用的运算符类型,并且每种类型运算符的作用都不同。运算符是用来操作数据的,因此,这些数据也被称为操作数,使用运算符将操作数连接而成的式子称为表达式。表达式具有如下特点:

18

博学谷——让IT教学更简单,让IT学习更有效

? 常量和变量都是表达式,例如,常量3.14、变量i。

? 运算符的类型对应表达式的类型,例如,算术运算符对应算术表达式。 ? 每一个表达式都有自己的值,即表达式都有运算结果。

2.4.2 算术运算符

在数学运算中最常见的就是加减乘除四则运算。C语言中的算术运算符就是用来处理四则运算的符号,这是最简单、最常用的运算符号。表2-10列出了C语言中的算术运算符及其用法。

表2-10 算术运算符

运算符 + - + - * / % ++ ++ -- -- 运算 正号 负号 加 减 乘 除 取模(即算术中的求余数) 自增(前) 自增(后) 自减(前) 自减(后) 范例 +3 b=4;-b; 5+5 6-4 3*4 5/5 7%5 a=2;b=++a; a=2;b=a++; a=2;b=--a; a=2;b=a--; 结果 3 -4 10 2 12 1 2 a=3;b=3; a=3;b=2; a=1;b=1; a=1;b=2; 算术运算符看上去都比较简单,也很容易理解,但在实际使用时还有很多需要注意的问题,接下来就针对其中比较重要的几点进行详细地讲解,具体如下:

1、进行四则混合运算时,运算顺序遵循数学中“先乘除后加减”的原则。例如,计算表达式“1+2*3”时,计算机先计算“2*3”的值,返回6,再计算“1+6”的值,返回7。

2、在进行自增(++)和自减(--)的运算时,如果运算符(++或--)放在变量的前面则是先进行自增或自减运算,再参与其他运算。反之,如果运算符放在操作数的后面则是先进行运算,再进行自增或自减。

请仔细阅读下面的代码块,思考运行的结果。

j=3; k=++j; printf(\j=3; k=j++; printf(\

第一行代码的运行结果是:4 4,因为++j先使变量j自增1,然后再将自增后的值赋值给k,即4;第二行代码的运行结果是:4 3,因为j++是先将j值赋值给k,再进行自增运算,即4;

3、在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有浮点数参与运算,系统会将整数数据隐形类型转换为浮点类型,最终得到的结果会是一个浮点数。例如,“2510/1000”属于整数之间相除,会忽略小数部分,得到的结果是2,而“2.5/10”的实际结果为0.25。

19

博学谷——让IT教学更简单,让IT学习更有效

请思考一下下面表达式的结果:

printf(\

结果为3000。由于表达式的执行顺序是从左到右,且三个常量是整型常量,所以先执行除法运算3500/1000,得到结果为3,然后再乘以1000,最终得到的结果自然就是3000。

4、取模运算在程序设计中都有着广泛的应用,例如判断奇偶数的方法就是求一个数字除以2的余数是1还是0。在进行取模运算时,运算结果的正负取决于被模数(运算符%左边的数)的符号,与模数(运算符%右边的数)的符号无关,如:(-5)%3=-2,而5%(-3)=2。

为了帮助大家更好地学习算术运算符,接下来通过一个案例来互换一个两位整数的个位和十位,具体如例2-9所示。 例2-9

1 #include 2 void main() 3 { 4 5 6 7 8 }

int num = 52, i, j; i = num / 10; j = num % 10;

// 这里定义一个整数52,52就是用于互换个位和十位的整数 // i用于存储整数52的十位,即5 // j用于存储整数52的个位,即2

printf(\将j作为十位,i作为个位,组成新的整数并输出

运行结果如图2-15所示。

图2-15 运行结果

从图2-15中可以看出,互换个位和十位后组成的新的整数打印了出来,由此可见,使用算术运算符可以很方便地对数据进行运算。

2.4.3 赋值运算符

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。表2-11列举了C语言中的赋值运算符及其用法。

表2-11 赋值运算符

运算符 = += -= 运算 赋值 加等于 减等于 乘等于 除等于 模等于 范例 a=3;b=2; a=3;b=2;a+=b; a=3;b=2;a-=b; a=3;b=2;a*=b; a=3;b=2;a/=b; a=3;b=2;a%=b; 结果 a=3;b=2; a=5;b=2; a=1;b=2; a=6;b=2; a=1;b=2; a=1;b=2; *= /= %= 在表2-11中,“=”的作用不是表示相等关系,而是赋值运算符,即将等号右侧的值赋给等号左侧的变量。在赋值运算符的使用中,需要注意以下几个问题:

1、在C语言中可以通过一条赋值语句对多个变量进行赋值,具体示例如下:

int x, y, z; x = y = z = 5;

// 为三个变量同时赋值

在上述代码中,一条赋值语句可以同时为变量x、y、z赋值,这是由于赋值运算符的结合性为“从右向左”,即先将5赋值给变量z,然后再把变量z的值赋值给变量y,最后把变量y的值赋值变量x,表达式赋值完成。需要注意的是,下面的这种写法在C语言中是不可取的。

20


第2章 数据类型与运算符(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:提高守法意识 预防职务犯罪-农村基层组织人员职务犯罪预防警示教

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: