160 likes | 297 Views
第九讲 位运算 枚举 类型定义 编译预处理. 参考书 《C 程序设计 》 第八章、第十一章、第十章: §10.9 、 §10.10. 本讲主要内容. 信息表示与存储 位运算 位字段结构体 枚举类型 类型定义 编译预处理. 信息的表示与存储 —— 二进制的编码表示. 问题的提出 : 负数的表示方法 0 的表示方法 解决方案之一: 原码 符号 — 绝对值表示 +0101011 的原码: 0 0101011 -0101011 的原码: 1 0101011 问题: 0 的表示不唯一 +0 : 00000000 , -0 : 10000000.
E N D
第九讲位运算 枚举 类型定义编译预处理 参考书《C程序设计》第八章、第十一章、第十章:§10.9、§10.10
本讲主要内容 • 信息表示与存储 • 位运算 • 位字段结构体 • 枚举类型 • 类型定义 • 编译预处理
信息的表示与存储——二进制的编码表示 • 问题的提出: • 负数的表示方法 • 0的表示方法 • 解决方案之一:原码 • 符号—绝对值表示 • +0101011的原码:00101011-0101011的原码:10101011 • 问题:0的表示不唯一+0:00000000,-0:10000000
信息的表示与存储——二进制的编码表示 • 解决方案之二:补码 • 求补码的方法 正数:同原码负数: • 求反,产生中间码——反码 (符号位不变,其他位求反) • 末位加1 • 补码的运算规则 • 符号位直接参加运算,最高位进位自然丢失?(将减法转换成了加法)
信息的表示与存储—定点数与浮点数 • 定点数 • 小数点固定在某一位置上 • 机器数的浮点表示 • 由阶符、阶码、尾符、尾数组成
位运算——按位与(&) • 运算规则 • 将两个运算量的每一个位进行逻辑与操作。 • 举例:计算 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;
位运算——按位或(|) • 运算规则 • 将两个运算量的每一个位进行逻辑或操作。 • 举例:计算 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;
位运算——按位异或(^) • 运算规则 • 两个操作数进行异或:若对应位相同,则结果该位为 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
位运算——取反(~) 单目运算符:对一个二进制数按位取反。 例1:025:0000000000010101 ~025:1111111111101010 例2:将 int 型数据 a 最低位置 0: a=a&~1 (~1是:11...10) (当a是16位或32位整数时都适用) 例 1 例 2
位运算——移位 例 3 • 左移运算(<<) 左移后,低位补0,高位舍弃。 • 右移运算(>>) 右移后,低位舍弃, 高位:无符号数补0 有符号数补0(逻辑右移) 补“符号位”(算术右移) 例 4 例5
位字段结构体 • 概念 • 特殊形式的结构体,成员项是二进制位字段。 • 几点说明: • P266~267
枚举类型 • 将需要的变量值一一列举出来,构成一个枚举类型。 enmu 枚举类型名 {变量值列表}; 例如: enum weekday {sun,mon,tue,wed,thu,fri,sat}; • 说明: P247 • 应用举例 P248 例10.12
类型定义 • 给类型定义一个新的名字 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;
编译预处理——文件包括 #include <包括文件名> 编译系统按系统设定的标准目录搜索包括文件。 #include "包括文件路径名" 编译系统按指定路径搜索。未指定路径名时,首先在当前目录中搜索,找不到时,再按系统设定的标准目录搜索包括文件。
编译预处理——宏定义 例 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;(运算顺序不对) • 说明 • 宏只是表达式的运算,不象函数调用需要进行控制转移。 • 其数据类型随实参不同而不同。形参及结果无固定类型。 • 不存在参数传递,具有较高的执行速度,但占内存较多。
作业 • 复习 《C程序设计》第八章、第十一章、第十章:§10.9、§10.10 • P267 11.1, 11.3 • 预习 《C程序设计》 第十二章