C语言程序设计 清华大学郑莉安颖莲 第九讲 位运算枚举类型定义 编译预处理 参考书《C程序设计》 第八章、第十一章、第十章:§10.9、§10.10 Page 1
C语言程序设计 清华大学 郑莉 安颖莲 Page 1 第九讲 位运算 枚举 类型定义 编译预处理 参考书《C程序设计》 第八章、第十一章、第十章:§10.9、§10.10
C语言程序设计 清华大学郑莉安颖莲 本讲主要内容 。信息表示与存储 位运算 ●1 位字段结构体 ● 枚举类型 ●, 类型定义 ·编译预处理 Page 2
C语言程序设计 清华大学 郑莉 安颖莲 Page 2 本讲主要内容 • 信息表示与存储 • 位运算 • 位字段结构体 • 枚举类型 • 类型定义 • 编译预处理
C语言程序设计 清华大学郑莉安颖莲 信息的表示与存储 二进制的编码表示 。问题的提出: 一负数的表示方法 -0的表示方法 ·解决方案之一:原码 -符号一绝对值表示 -+0101011的原码:00101011 -0101011的原码:10101011 问题:0的表示不唯一 +0:00000000,-0:10000000
C语言程序设计 清华大学 郑莉 安颖莲 信息的表示与存储 ——二进制的编码表示 • 问题的提出: - 负数的表示方法 - 0的表示方法 • 解决方案之一:原码 - 符号—绝对值表示 - +0101011的原码:00101011 -0101011的原码:10101011 - 问题:0的表示不唯一 +0:00000000,-0:10000000
C语言程序设计 清华大学郑莉安颖莲 信息的表示与存储 二进制的编码表示 ·解决方案之二:补码 求补码的方法 正数:同原码 负数: 。求反,产生中间码 反码 (符号位不变,其他位求反) 。末位加1 -补码的运算规则 ·符号位直接参加运算,最高位进位自然丢失?(将减 法转换成了加法)
C语言程序设计 清华大学 郑莉 安颖莲 信息的表示与存储 ——二进制的编码表示 • 解决方案之二:补码 - 求补码的方法 正数:同原码 负数: • 求反,产生中间码——反码 (符号位不变,其他位求反) • 末位加1 - 补码的运算规则 • 符号位直接参加运算,最高位进位自然丢失?(将减 法转换成了加法)
C语言程序设计 清华大学郑莉安颖莲 信息的表示与存储 一定点数与浮点数 定点数 -小数点固定在某一位置上 ·机器数的浮点表示 -由阶符、阶码、尾符、尾数组成
C语言程序设计 清华大学 郑莉 安颖莲 信息的表示与存储 —定点数与浮点数 • 定点数 - 小数点固定在某一位置上 • 机器数的浮点表示 - 由阶符、阶码、尾符、尾数组成
C语言程序设计 清华大学郑莉安颖莲 位运算 按位与(&) 运算规则 -将两个运算量的每一个位进行逻辑与操作。 举例:计算3&5 先将3和5表示为补码,再按位与: 3: 00000011 5:(&)00000101 3&5: 00000001 。 用途: -将某一位置0,其它位不变。 例如:将char型变量a的最低位置0:a=a&0376; 取指定位。 例如:有char c;inta; 取出a的低宇节,置于c中:c=a&0377; Page 6
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语言程序设计 清华大学郑莉安颖莲 位运算 按位或 () 。 运算规则 一将两个运算量的每一个位进行逻辑或操作。 。 举例:计算35 先将3和5表示为补码,再按位或: 3: 00000011 5:D00000101 35: 00000111 ·用途: 将某些位置1,其它位不变。 例如:将int型变量a的低字节置1: a a0xff; Page 7
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语言程序设计 清华大学郑莉安颖莲 位运算 按位异或 。 运算规则 两个操作数进行异或: 若对应位相同,则结果该位为0, 若对应位不同,则结果该位为1。 ·举例:计算071^052 071: 00111001 052: A)00101010 071^052: 00010011 。用途: 使特定位翻转(与0异或保持原值,与1异或取反) 例如:要使01111010低四位翻转: 01111010 00001111 01110101 Page 8
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语言程序设计 清华大学郑莉安颖莲 位运算 取反() 单目运算符:对一个二进制数按位取反。 例1:025:.0000000000010101 例1 025:1111111111101010 例2:将int型数据a最低位置0: a=a&~1 例2 (~1是:11.10) (当a是16位或32位整数时都适用) Page 9
C语言程序设计 清华大学 郑莉 安颖莲 Page 9 位运算——取反(~) 单目运算符:对一个二进制数按位取反。 例1:025:0000000000010101 ~025:1111111111101010 例2:将 int 型数据 a 最低位置 0: a=a&~1 (~1是:11.10) (当a是16位或32位整数时都适用) 例 1 例 2
C语言程序设计 清华大学郑莉安颖莲 位运算 移位 ·左移运算(>) 例4 右移后,低位舍弃, 高位:无符号数补0 有符号数补0(逻辑右移) 补“符号位”(算术右移) 例5 Page 12
C语言程序设计 清华大学 郑莉 安颖莲 Page 12 位运算——移位 • 左移运算(>) 右移后,低位舍弃, 高位:无符号数补0 有符号数补0(逻辑右移) 补“符号位”(算术右移) 例 3 例 4 例5