第2章 数据类型与运算符 - 1207

2026/1/14 8:19:35

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

要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。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型输出。

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

int a=321; printf(\

17

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

运行结果为“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) (int)x+y

// 将表达式x+y的值转换成double类型 // 将变量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),内部的存储方式不变,但外部值却可能改变。

将一个非unsigned整型数据赋给一个长度相同的unsigned型变量时,内部存储形式不变,但外部表示时总是无符号的。

为了帮助大家更好地学习类型转换,接下来通过一个案例进行一些简单的算术,具体如例2-8所示。 18

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

例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运算符

用于处理四则运算 用于将表达式的值赋给变量 用于表达式的比较,并返回一个真值或假值 用于根据表达式的值返回真值或假值 用于根据表达式的值执行相应的语句 用于连接并执行若干表达式,并返回最后一个表达式的值 用于处理数据的位运算 用于求字节数长度 19

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

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

? 常量和变量都是表达式,例如,常量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。

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

printf(\

结果为3000。由于表达式的执行顺序是从左到右,且三个常量是整型常量,所以先执行除法运

20


第2章 数据类型与运算符 - 1207.doc 将本文的Word文档下载到电脑
搜索更多关于: 第2章 数据类型与运算符 - 1207 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

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