欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    结构、联合、位运算和枚举类型.ppt

    • 资源ID:6428091       资源大小:508KB        全文页数:124页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    结构、联合、位运算和枚举类型.ppt

    2023/10/30,1,主讲教师:*个人主页:*,C语言程序设计(C99版),四川大学计算机学院,四川大学计算机学院,2023/10/30,2,教材:C语言程序设计(C99版),陈良银 游洪跃 李旭伟 主编李志蜀 唐宁九 李 涛 主审清华大学出版社2006年9月出版,2023/10/30,3,本书内容,第1章 基础知识第2章 C语言的基本要素第3章 变量名、数据类型、运算符和表达式第4章 C程序基本控制结构第5章 函数第6章 数组和指针第7章 递归第8章 结构、联合、位运算和枚举类型 第9章 预处理命令 第10章 文件 第11章 高级话题第12章 C89 Vs C99实验(待安排),2023/10/30,4,枚举类型,本章主要内容,ARM Vector Table,FIQ,IRQ,(Reserved),Data Abort,Prefetch Abort,Software Interrupt,Undefined Instruction,Reset,1,3,2,联合,结构,4,类型定义:typedef,5,位段,2023/10/30,5,本章的节本要求,本章主要介绍C语言的结构、联合、枚举类型、类型定义:typedef和段位的基本概念和使用方法。本章要求读者能使用结构、联合、枚举类型、类型定义:typedef和段位的编写简单的应用程序。希望读者在计算机上调试运行教材中的程序。在网页:http:/,2023/10/30,6,8.1 结构 8.1.1概述,在解决实际问题中,一组数据一般具有不同的数据类型。结构是一种构造类型,它由若干成员组成的。,2023/10/30,7,8.1.2结构的声明,一、结构类型的定义定义一个结构的一般形式为:struct 结构类型名 成员表列;成员表由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符 成员名;成员名的命名应符合标识符的书写规定。,2023/10/30,8,8.1.2结构的声明,例如:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/float score;/*成绩*/;,2023/10/30,9,在上面的结构定义中,结构名为StudentType,此结构由4个成员组成,如下图所示。第一个成员为num,整型变量;第二个成员为name,字符指针;第三个成员为sex,字符数组;第四个成员为score,实型变量。注意在括号后的分号是不可缺少的。结构定义后,即可进行变量说明。凡说明为结构StudentType的变量都由上述4个成员组成。结构是一种构造的数据类型,是数目固定,类型不同的若干有序变量的集合。,2023/10/30,10,二、结构类型变量的定义以上面定义的SttudentType为例来加以说明1先定义结构类型,再说明结构变量。这种定义一个结构变量的一般形式如下:struct 结构类型名 成员表列;结构类型名 结构变量列表;,2023/10/30,11,上面结构变量列表中不同结构变量之间用逗号,隔开,例如:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/float score;/*成绩*/;struct StudentType boy,girl;/*定义结构变量*/上面定义了两个变量boy和girl为StudentType结构类型。,2023/10/30,12,2在定义结构类型的同时说明结构变量。这种定义一个结构变量的一般形式如下:struct 结构类型名 成员表列 结构变量列表;,2023/10/30,13,例如:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/float score;/*成绩*/boy,girl;/*定义结构类型变量*/上面的定义与第一种方法相同,也定义了两个变量boy和girl为StudentType结构类型。,2023/10/30,14,3直接说明结构变量这种定义一个结构变量的一般形式如下:struct 成员表列 结构变量列表;例如:structint num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/float score;/*成绩*/boy,girl;/*定义结构类型变量*/,2023/10/30,15,结构类型的成员也可以又是一个结构,即构成了嵌套的结构类型。例如,按下图可给出以下结构定义:,2023/10/30,16,struct DateType/*定义结构类型*/int year;/*年*/int month;/*月*/int day;/*日*/;定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/struct DateType birthday/*生日*/float score;/*成绩*/boy,girl;/*定义结构类型变量*/,2023/10/30,17,在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。,2023/10/30,18,8.1.3结构类型变量的引用,表示结构变量成员的一般形式是:结构变量名.成员名结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成,下面通过示例进行说明。,2023/10/30,19,例8.1 试编写为结构变量赋值并输出其值的程序。S8_1.C/*为结构变量student赋值*/student.num=10101;/*为num赋值*/student.name=德华刘;/*为name赋值*/strcpy(student.sex,男);/*为sex复制赋值*/student.birthday.year=1962;/*为year赋值*/student.birthday.month=8;/*为month赋值*/student.birthday.day=18;/*为day赋值*/student.score=98.1;/*为score赋值*/,2023/10/30,20,/*输出结构变量student*/printf(学号:%dn,student.num);/*输出num*/printf(姓名:%sn,student.name);/*输出name*/printf(性别:%sn,student.sex);/*输出sex*/printf(生日:%d年,%d月,%d日n,/*输出birthday*/student.birthday.year,student.birthday.month,student.birthday.day);printf(成绩:%4.1fn,student.score);/*输出score*/,2023/10/30,21,程序运行结果如下:,2023/10/30,22,8.1.4结构变量的初始化,结构体变量也与其他为变量一样,可以在定义的同时进行初始化,下面通过示例加以说明。例 8.2 对结构变量初始化并输出其值。S8_2.Cstruct StudentType student=/*定义结构类型变量并同时进行初始化*/10168,/*初始化num*/学友张,/*初始化name*/男,/*初始化sex*/1963,6,18,/*初始化birthday*/99.8/*初始化score*/;,2023/10/30,23,8.1.4结构变量的初始化,/*输出结构变量student*/printf(学号:%dn,student.num);/*输出num*/printf(姓名:%sn,student.name);/*输出name*/printf(性别:%sn,student.sex);/*输出sex*/printf(生日:%d年%d月%d日n,/*输出birthday*/student.birthday.year,student.birthday.month,student.birthday.day);printf(成绩:%4.1fn,student.score);/*输出score*/,2023/10/30,24,8.1.4结构变量的初始化,程序运行结果如下:,2023/10/30,25,8.1.5结构数组,数组元素也可以是结构类型的。可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同结构的一个群体。如一个班的学生信息,一个车间职工信息等。,2023/10/30,26,一、结构数组的定义结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。例如:#define N 3struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/;struct StudentType studentN;/*定义结数组*/,2023/10/30,27,上面定义了数组student,元素类型为StduentType,数组共有N个元素,读者也可象定义结构类型变量一样进行直接定义,例如:#define N 3struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/studentN;/*定义结构数组*/,2023/10/30,28,或#define N 3structint num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/studentN;/*定义结构数组*/,2023/10/30,29,如下图所示。,2023/10/30,30,二、结构数组的初始化与其他类型的数组一样,对结构数组可以作初始化赋值,下面通过示例加以说明。例 8.3 对结构数组初始化并输出结构变量。S8_3.Cstruct StudentType studentN=/*定义结数组并进行初始化*/10101,德华刘,男,42,98.1,10102,靓影张,女,22,99.8,10103,学友张,男,43,96.5;/*输出结构数组student*/for(i=0;i N;i+)/*输出第i个学生信息*/printf(%8d,studenti.num);/*输出num*/printf(%12s,studenti.name);/*输出name*/printf(%6s,studenti.sex);/*输出sex*/printf(%6d,studenti.age);/*输出age*/printf(%8.1fn,studenti.score);/*输出score*/,2023/10/30,31,程序运行结果如下:,2023/10/30,32,定义结构数组时,可不指定元素个数,例如struct StudentType student=/*定义结数组并进行初始化*/10101,德华刘,男,42,98.1,10102,靓影张,女,22,99.8,10103,学友张,男,43,96.5;,2023/10/30,33,在编译时,系统将根据初始结构个数自动地确定数组元素个数,当然也可采用如下的直接定义结构数组并初始化的形式:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/student=/*定义结数组并进行初始化*/10101,德华刘,男,42,98.1,10102,靓影张,女,22,99.8,10103,学友张,男,43,96.5;,2023/10/30,34,或structint num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/student=/*定义结数组并进行初始化*/10101,德华刘,男,42,98.1,10102,靓影张,女,22,99.8,10103,学友张,男,43,96.5;,2023/10/30,35,三、结构数组实例下面将举一些简单的说明性示例说明结构数组的使用方法。例8.4计算学生的平均成绩以及及格的人数。S8_4.C/*计算平均成绩及及格学生人数*/for(i=0;i=60)/*及格,numOfPass自加1*/countOfPass+;av=sum/N;,2023/10/30,36,程序运行结果如下:,2023/10/30,37,例8.5 建立同学通讯录。S8_5.Cfor(i=0;i NUM;i+)/*输入通讯信息*/printf(n输入第%d个人通讯信息:n,i+1);printf(输入姓名:);gets(menberi.name);printf(输入电话号码:);gets(menberi.phone);printf(nn姓名ttt电话号码nn);for(i=0;i NUM;i+)/*输出个人通讯信息*/printf(%sttt%sn,menberi.name,menberi.phone);,2023/10/30,38,程序参考运行结果如下:,2023/10/30,39,8.1.5指向结构类型的指针,一、指向结构变量的指针当指针变量用来指向一个结构变量时,这样的指针变量称之为结构指针变量。结构指针变量中的值就是所指向的结构变量的首地址。读者可通过结构指针访问该结构变量,结构指针变量说明的一般形式为:结构类型名*结构指针变量名 例如,在前面的例8.1定义了StudentType这个结构类型,如要说明一个指向StudentType的指针变量pStudent,可写为:struct StudentType*pStudent;,2023/10/30,40,也可在定义结构类型的同时说明pStudent,例如:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/DateType birthday;/*生日*/float score;/*成绩*/*pStudent;,2023/10/30,41,或structint num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/DateType birthday;/*生日*/float score;/*成绩*/*pStudent;,2023/10/30,42,结构指针变量必须要赋值之后才能使用,赋值是将结构变量的首地址赋予该指针变量,不能将结构类型名的地址赋值给指针变量,例如:struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/DateType birthday;/*生日*/float score;/*成绩*/;struct StudentType boy,*pStudent;/*boy为结构变量,pStudent为 结构指针变量*/pStudent=错误,不能将结构类型名的地址赋值给pStudent*/,2023/10/30,43,有了结构指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为:(*结构指针变量).成员名或结构指针变量-成员名,2023/10/30,44,例如:(*pStudent).num或pStudent-num注意:(*pStudent)两侧的括号不可少,这是由于成员符.的优先级高于*。如去掉括号写作*pStudent.num则等效于*(pStudent.num),意义是完全不对了。下面通过例子来说明结构指针变量的具体说明和使用方法。,2023/10/30,45,例8.6 结构指示使用示例。S8_6.C说明:在C语言中,pStudent-num与(*pStudent).num等价,但前者更直观,希望读者多使用前者的形式。struct StudentType/*定义结构类型*/int num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/struct DateType birthday;/*生日*/float score;/*成绩*/;struct StudentType student;/*定义结构类型变量student*/struct StudentType*pStudent;/*结构指针变量pStudent*/,2023/10/30,46,pStudent=/*为score赋值*/,2023/10/30,47,/*输出学生信息*/printf(学号:%dn,pStudent-num);/*输出num*/printf(姓名:%sn,pStudent-name);/*输出name*/printf(性别:%sn,pStudent-sex);/*输出sex*/printf(生日:%d年,%d月,%d日n,/*输出birthday*/pStudent-birthday.year,pStudent-birthday.month,pStudent-birthday.day);printf(成绩:%4.1fn,pStudent-score);/*输出score*/说明:在C语言中,pStudent-num与(*pStudent).num等价,但前者更直观,希望读者多使用前者的形式。,2023/10/30,48,二、指向结构数组变量的指针前面已介绍过可使用指向数组元素的指针,同样地对于结构数组,也可用指针来指向结构数组元素,设pStudent为指向结构数组元素的指针变量,则pStudent也指向该结构数组的1个元素,pStudent+1指向2号元素,pStudent+i则指向i+1号元素。这与普通数组的情况是一致的。,2023/10/30,49,例8.7 用指针变量输出结构数组。S8_7.C/*输出结构数组student*/for(pStudent=student;pStudent num);/*输出num*/printf(%12s,pStudent-name);/*输出name*/printf(%6s,pStudent-sex);/*输出sex*/printf(%6d,pStudent-age);/*输出age*/printf(%8.1fn,pStudent-score);/*输出score*/程序运行结果如下所示:,2023/10/30,50,8.2 联合 8.2.1联合的概念,与结构类型一样,联合类型也是一种构造类型。在一个联合类型内可以定义多种不同的数据类型,在一个被说明为该联合类型的变量中,各个成员共享同一个存储空间。联合类型与结构类型有一些相似之处。但两者有本质上的不同。在结构类型中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在联合类型中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。,2023/10/30,51,8.2.2 联合的定义,定义一个联合类型的一般形式为:union 联合类型名 成员表;成员表中含有若干成员,成员的一般形式为:类型说明符 成员名;成员名的命名应符合标识符的规定。,2023/10/30,52,例如:union ClassOrOfficeTypeint clas;/*班级*/char office10;/*教研室*/;,2023/10/30,53,8.2.3联合变量的说明,(1)选定义联合类型,再说明联合变量union ClassOrOfficeTypeint clas;/*班级*/char office10;/*教研室*/;union ClassOrOfficeType classOrOffice;,2023/10/30,54,(2)定义联合类型的同时说明联合变量union ClassOrOfficeTypeint clas;/*班级*/char office10;/*教研室*/classOrOffice;(3)和直接说明联合变量。unionint clas;/*班级*/char office10;/*教研室*/classOrOffice;,2023/10/30,55,经说明后的classAndOffice变量为ClassAndOfficeType类型。它们的内存分配示意图如下图所示。,2023/10/30,56,8.2.4联合变量的赋值和使用,对联合变量的赋值,只能对变量的成员进行赋值。联合变量的成员表示为:联合变量名.成员名例如,classOrOffice被说明为ClassOrOfficeType类型的变量之后,可对classOrOffice.clas或classOrOffice.office进行赋值。不允许对联合变量作初始化赋值,赋值只能在程序中进行。还要再强调说明的是,一个联合变量,每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。,2023/10/30,57,例8.8设有一个教师与学生通用的表格,教师数据有姓名,年龄,身份,教研室四项。学生有姓名,年龄,身份,班级四项。编程输入人员数据,再以表格输出。S8_8.C/*输入个人个息*/for(i=0;i N;i+)/*输入第i+1个人信息*/printf(“第%d个人的输入姓名,年龄,身份,班级或教研室n,i+1);scanf(%s%d%c,personi.name,2023/10/30,58,/*输出个人个息*/printf(nn姓名t年龄t身份t班级/教研室n);for(i=0;i N;i+)/*输出第i+1个人的信息*/if(personi.identity=s)/*输出学生信息*/printf(%st%3dt%3ct%dn,personi.name,personi.age,personi.identity,personi.classOrOffice.clas);else/*输出教师信息*/printf(%st%3dt%3ct%dn,personi.name,personi.age,personi.identity,personi.classOrOffice.office);,2023/10/30,59,程序运行结果如下所示:,2023/10/30,60,8.3 枚举类型,在实际问题中,有些变量的取值被限定在一个有限的范围内。为此,语言提供了一种所谓的枚举的类型。在枚举类型的定义中列举出所有可能的取值,被说明为该枚举类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。,2023/10/30,61,8.3.1枚举类型的定义和枚举变量的说明,一、枚举类型的定义枚举类型定义的一般形式为:enum 枚举类型名 枚举值表;在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。,2023/10/30,62,例如:enum WeekdayType sun,mou,tue,wed,thu,fri,sat;此枚举类型名为WeekdayType,枚举值共有7个,即一周中的七天。凡被说明为WeekdayType类型变量的取值只能是七天中的某一天。,2023/10/30,63,二、枚举变量的说明(1)先定义后说明 enum WeekdayType sun,mou,tue,wed,thu,fri,sat;enum WeekdayType today,yesterday,tomorrow,2023/10/30,64,(2)同时定义说明enum WeekdayType sun,mou,tue,wed,thu,fri,sattoday,yesterday,tomorrow;(3)直接说明enum sun,mou,tue,wed,thu,fri,sattoday,yesterday,tomorrow;,2023/10/30,65,三、枚举类型变量的使用枚举类型在使用中有以下规定:1枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举WeekdayType的元素再作以下赋值:sun=5;mon=2;sun=mon;都是错误的。2枚举元素本身由系统定义了一个表示序号的数值,缺省从0 开始顺序定义为0,1,2。如在WeekdayType中,sun值为0,mon值为1,,sat值为6。,2023/10/30,66,例8.9 枚举元素值示例S8_9.Cenum WeekdayType/*定义枚举类型*/sun,mon,tue,wed,thu,fri,sat;enum WeekdayType weekday;/*定义枚举变量*/weekday=sun;printf(%6dn,weekday);/*输出sum值*/weekday=mon;printf(%6dn,weekday);/*输出mon值*/weekday=tue;printf(%6dn,weekday);/*输出tue值*/weekday=wed;printf(%6dn,weekday);/*输出wed值*/,2023/10/30,67,程序运行结果如下所示:,2023/10/30,68,要使枚举值从1到7,可使用如下方式定义:enum WeekdayType/*定义枚举类型*/sun=1,mon,tue,wed,thu,fri,sat;,2023/10/30,69,3只能将枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。例如:weekday=sun;是正确的,而weekday=0;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如:weekday=(WeekdayType)6;其意义是将顺序号为6的枚举元素赋予枚举变量weekday,相当于:weekday=sat;还应该说明的是枚举元素是标识符,而不是字符常量也不是字符串常量,使用时不要加单、双引号。,2023/10/30,70,例8.10 在口袋中装有红、黄、蓝和白4种颜色的小球苦干个,每次从口袋中先后取出3个小球,试编程输出在得到的3种不同色的球的可能取法的排列情况。S8_10.C用枚举类型来表示不同的颜色,用count对不同色球的排列进行计数。,2023/10/30,71,/*显示颜色color*/void PrintColor(enum ColorType color)switch(color)case red:/*显示红色*/printf(%-10s,red);break;case yellow:/*显示黄色*/printf(%-10s,yellow);break;case blue:/*显示蓝色*/printf(%-10s,blue);break;case white:/*显示白色*/printf(%-10s,white);break;,2023/10/30,72,for(i=0;i 4;i+)color_i=(enum ColorType)i;/*强制转换成枚举类型*/for(j=0;j 4;j+)color_j=(enum ColorType)j;/*强制转换成枚举类型*/if(color_i!=color_j)for(k=0;k 4;k+)color_k=(enum ColorType)k;/*强制转换成枚举类型*/if(color_k!=color_i/*换行*/,2023/10/30,73,2023/10/30,74,8.4 类型定义:typedef,可使用typedef声明新的类型名来代替已有的类型名。typedef定义的一般形式为:typedef 原类型名 新类型名;例如,在一个程序中,如果一个整型变量用来计数,可将整型int声明为CountType,具体代码如下:typedef int CountType;这样在程序中使用声明:CountType i;定义CountType类型的变量i,其意义更加明确,可读性更强。,2023/10/30,75,可以声明结构类型如下:typedef structint num;/*学号*/char*name;/*姓名*/char sex3;/*性别*/int age;/*年龄*/float score;/*成绩*/StudentType;可用新声明的类型名StudentType代替上面的结构类型,进行如下的变量声明:StudentType person;/*person为结构变量*/StudentType*pStudent;/*pStudent为指向结构类型的指针*/,2023/10/30,76,如下声明是错误。struct StudentType person;可用typedef来声明数组,例如如下的数组声明:int aN,bN,cN,dN,eN,fN,gN,hN;这些数组都是一维数组,元素个数都相同,可以先为数组声明一个新类型名:typedef int ArrayTypeN;然后再用ArrayType去定义数组变量:ArrayType a,b,c,d,e,f,g,h;,2023/10/30,77,使用typedef有利于程序的移植,例如在有些计算机系统中,int型数据占用两个字符,而在另外一些计算机系统中确占用4个字节,如果将一个C程序从一个以4个字节存放的int数的计算机系统移植到以两个字节存放int数的计算机系统,一般的办法是将程序中的所有int都改为long,例如将:int i,j,k;改为:long i,j,k;实际上可用INTEGER来声明int:typedef int INTEGER;在程序中所有int型变量都用INTEGER来定义,在移植时只需改动typedef定义即可:typedef long INTEGER;,2023/10/30,78,8.5 位运算符,前面介绍的各种运算都是以字节为最基本存储单元进行进行操作的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。语言为此提供了位运算的功能,这使得语言也能像汇编语言一样用来编写系统程序。,2023/10/30,79,语言位运算符提供了六种位运算符,如下表所示。,2023/10/30,80,8.6.1 位运算符介绍,1按位与运算&按位与运算符&是双目运算符。功能是参与运算的两数各对应的位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0,也就是:0&0=01&0=00&1=01&1=1,2023/10/30,81,例8.11 计算9&5。S8_11.C可写算式如下:00001001&00000101,具体运算如下,可知00001001&00000101=00000001,也就是9&5=1:,2023/10/30,82,说明:按位与运算通常用来对某些位清0或保留某些位,例如将a 的高八位清 0,只保留低八位。可作a&255 运算(255 的二进制数为11111111)加以实现。,2023/10/30,83,int main(void)/*主函数main(void)*/int a=9,b=5,c;c=a/*返回值0*/运行结果如下:,2023/10/30,84,2按位或运算|按位或运算符|是双目运算符。功能是将参与运算的两数各对应的二进位相或。只要对应的两个两个二进位有一个为1时,结果位就为1,否则为0,也就是:0|0=01|0=10|1=11|1=1,2023/10/30,85,例8.12 计算9|5。S8_12.C可写算式如下:00001001|00000101,具体运算如下。可知00001001|00000101=00001101,也就是9|5=13。,2023/10/30,86,int main(void)/*主函数main(void)*/int a=9,b=5,c;c=a|b;printf(%d|%d=%dn,a,b,c);system(PAUSE);/*调用库函数system()*/return 0;/*返回值0*/运行结果如下:,2023/10/30,87,3按位异或运算按位异或运算符是双目运算符。功能是参与运算的两数各对应的二进位相异或,当对应的二进位相异时,结果为1,否则结果为0,也就是:0 0=01 0=10 1=11 1=0,2023/10/30,88,例8.13 计算9 5。S8_13.C可写算式如下:00001001 00000101,具体运算如下。可知00001001 00000101=00001100,也就是9|5=12。,2023/10/30,89,int main(void)/*主函数main(void)*/int a=9,b=5,c;c=a b;printf(%d%d=%dn,a,b,c);system(PAUSE);/*调用库函数system()*/return 0;/*返回值0*/运行结果如下:,2023/10/30,90,4求反运算求反运算符为单目运算符,功能是对参与运算的数的各二进位按位求反。例9.14 计算9。S8_14.C计算9的算式如下:,2023/10/30,91,即(00000000000000000000000000001001)结果为:,计算机内部以补码表示一个数,由补码求原码的规则是:(1)正数的原码与补码相同;(2)负数的原码是除符号位外,各位取反,再加1。由此可知的原码为:其中最高位是符号位,1表示负数,0表示正数,可知为十进制数的-10,2023/10/30,92,int main(void)/*主函数main(void)*/int a=9,b;b=a;printf(%d=%dn,a,b);system(PAUSE);/*调用库函数system()*/return 0;/*返回值0*/运行结果如下:,2023/10/30,93,5左移运算左移运算符是双目运算符。功能是将左边的操作数的各二进位全部左移若干位,由右边的数指定移动的位数,高位丢弃,低位补0。例8.15 设a=3,计算a 4。S8_15.Ca的二进制可表示为00000011,将00000011左移4位后为00110000(十进制48)。,2023/10/30,94,int main(void)/*主函数main(void)*/int a=3,b=4,c;c=a b;printf(%d%d=%dn,a,b,c);system(PAUSE);/*调用库函数system()*/return 0;/*返回值0*/运行结果如下:,2023/10/30,95,6右移运算右移运算符是双目运算符。功能是将左边的操作数的各二进位全部右移若干位,右边的数指定移动的位数。例8.16 设a=15,计算a 2。S8_16.Ca的二进制可表示为000001111,表示把000001111右移2位变为00000011(十进制3)。,2023/10/30,96,int main(void)/*主函数main(void)*/int a=15,b=2,c;c=a b;printf(%d%d=%dn,a,b,c);system(PAUSE);/*调用库函数system()*/return 0;/*返回值0*/运行结果如下:,2023/10/30,97,8.6.2 位运算综合举例,例8.17 输入一个无符号整数a,取出从右端开始的58位。S8_17.C可按如下的操作实现:(1)可先将a右移5位,如下图所示。,2023/10/30,98,右移5位可用下面的方法实现:a 5(2)设置一个低4位全为1,其余各位全为0的数,可用如下方法实现:(0 5)&(0 4),2023/10/30,99,int main(void)/*主函数main(void)*/unsigned int a,b,c,d;printf(用十六进制数输入a:);scanf(%x,/*返回值0*

    注意事项

    本文(结构、联合、位运算和枚举类型.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开