1 / 16

第九讲 位运算 枚举 类型定义 编译预处理

第九讲 位运算 枚举 类型定义 编译预处理. 参考书 《C 程序设计 》 第八章、第十一章、第十章: §10.9 、 §10.10. 本讲主要内容. 信息表示与存储 位运算 位字段结构体 枚举类型 类型定义 编译预处理. 信息的表示与存储 —— 二进制的编码表示. 问题的提出 : 负数的表示方法 0 的表示方法 解决方案之一: 原码 符号 — 绝对值表示 +0101011 的原码: 0 0101011 -0101011 的原码: 1 0101011 问题: 0 的表示不唯一 +0 : 00000000 , -0 : 10000000.

Download Presentation

第九讲 位运算 枚举 类型定义 编译预处理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九讲位运算 枚举 类型定义编译预处理 参考书《C程序设计》第八章、第十一章、第十章:§10.9、§10.10

  2. 本讲主要内容 • 信息表示与存储 • 位运算 • 位字段结构体 • 枚举类型 • 类型定义 • 编译预处理

  3. 信息的表示与存储——二进制的编码表示 • 问题的提出: • 负数的表示方法 • 0的表示方法 • 解决方案之一:原码 • 符号—绝对值表示 • +0101011的原码:00101011-0101011的原码:10101011 • 问题:0的表示不唯一+0:00000000,-0:10000000

  4. 信息的表示与存储——二进制的编码表示 • 解决方案之二:补码 • 求补码的方法 正数:同原码负数: • 求反,产生中间码——反码 (符号位不变,其他位求反) • 末位加1 • 补码的运算规则 • 符号位直接参加运算,最高位进位自然丢失?(将减法转换成了加法)

  5. 信息的表示与存储—定点数与浮点数 • 定点数 • 小数点固定在某一位置上 • 机器数的浮点表示 • 由阶符、阶码、尾符、尾数组成

  6. 位运算——按位与(&) • 运算规则 • 将两个运算量的每一个位进行逻辑与操作。 • 举例:计算 3 & 5 先将 3 和 5 表示为补码,再按位与: 3: 0 0 0 0 0 0 1 1 5:(&) 0 0 0 0 0 1 0 1 3 & 5: 0 0 0 0 0 0 0 1 • 用途: • 将某一位置0,其它位不变。例如:将 char型变量 a的最低位置0:a = a & 0376; • 取指定位。例如:有 char c; int a; 取出 a 的低字节,置于c 中:c = a & 0377;

  7. 位运算——按位或(|) • 运算规则 • 将两个运算量的每一个位进行逻辑或操作。 • 举例:计算 3 | 5 先将 3 和 5 表示为补码,再按位或: 3: 0 0 0 0 0 0 1 1 5:(|) 0 0 0 0 0 1 0 1 3 | 5: 0 0 0 0 0 1 1 1 • 用途: • 将某些位置1,其它位不变。例如:将 int型变量 a的低字节置1:a = a | 0xff;

  8. 位运算——按位异或(^) • 运算规则 • 两个操作数进行异或:若对应位相同,则结果该位为 0, 若对应位不同,则结果该位为 1。 • 举例:计算 071^052 071: 0 0 1 1 1 0 0 1 052:(^) 0 0 1 0 1 0 1 0 071^052 : 0 0 0 1 0 0 1 1 • 用途: • 使特定位翻转(与0异或保持原值,与1异或取反)。 例如:要使 01111010低四位翻转: 0 1 1 1 1 0 1 0 (^) 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1

  9. 位运算——取反(~) 单目运算符:对一个二进制数按位取反。 例1:025:0000000000010101 ~025:1111111111101010 例2:将 int 型数据 a 最低位置 0: a=a&~1 (~1是:11...10) (当a是16位或32位整数时都适用) 例 1 例 2

  10. 位运算——移位 例 3 • 左移运算(<<) 左移后,低位补0,高位舍弃。 • 右移运算(>>) 右移后,低位舍弃, 高位:无符号数补0 有符号数补0(逻辑右移) 补“符号位”(算术右移) 例 4 例5

  11. 位字段结构体 • 概念 • 特殊形式的结构体,成员项是二进制位字段。 • 几点说明: • P266~267

  12. 枚举类型 • 将需要的变量值一一列举出来,构成一个枚举类型。 enmu 枚举类型名 {变量值列表}; 例如: enum weekday {sun,mon,tue,wed,thu,fri,sat}; • 说明: P247 • 应用举例 P248 例10.12

  13. 类型定义 • 给类型定义一个新的名字 typedef 已定义过的类型名 新类型名; • 例: • 或: • typedef struct person • { • char name[20]; • char address[100]; • char tel[20]; • }PERSON; • struct person • { • char name[20]; • char address[100]; • char tel[20]; • } • typedef struct person PERSON;

  14. 编译预处理——文件包括 #include <包括文件名> 编译系统按系统设定的标准目录搜索包括文件。 #include "包括文件路径名" 编译系统按指定路径搜索。未指定路径名时,首先在当前目录中搜索,找不到时,再按系统设定的标准目录搜索包括文件。

  15. 编译预处理——宏定义 例 6 • 定义符号常量 • 定义带参数的宏 例1:#define POWER(X) ((X)*(X)) 在程序中使用时: z=POWER(x+y); 编译时替换为: z=((x+y)*(x+y)); 例2:#define POWER(X) X*X 在程序中使用时: z=POWER(x+y); 编译时替换为:z=x+y*x+y;(运算顺序不对) • 说明 • 宏只是表达式的运算,不象函数调用需要进行控制转移。 • 其数据类型随实参不同而不同。形参及结果无固定类型。 • 不存在参数传递,具有较高的执行速度,但占内存较多。

  16. 作业 • 复习 《C程序设计》第八章、第十一章、第十章:§10.9、§10.10 • P267 11.1, 11.3 • 预习 《C程序设计》 第十二章

More Related