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