C语言程序设计 清华大学郑莉安颖莲 第九讲 位运算枚举类型定 编译预处理 参考书《C程序设计》 第八章、第十一章、第十章:§10.9、§10.10
C语言程序设计 清华大学 郑莉 安颖莲 Page 1 第九讲 位运算 枚举 类型定义 编译预处理 参考书《C程序设计》 第八章、第十一章、第十章:§10.9、§10.10
C语言程序设计 清华大学郑莉安颖莲 本讲主要内容 傖息表尔与存储 位运算 位字段结构体 枚举类烈 类型定义 编译预处理
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表示为补码,再按位与: 00000011 5:(&)00000101 3&5 00000001 用途: 将某一位置0,其它位不变。 例如:将char型变量a的最低位置0:a=a&0376; 取指定位。 例如:有 char c;inta; 取出a的低字节,置于c中:c=a&0377
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语言程序设计 清华大学郑莉安颖莲 立运算按位或() 运算规则 将两个运算量的每一个位进行逻辑或操作。 举例:计算3|5 先将3和5表示为补码,再按位或: 3: 00000011 5:()00000101 35 00000111 用途: 将某些位置1,其它位不变。 例如:将int型变量a的低字节置1: a =a Oxff
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:(^)00101010 071^052 00010011 用途: 使特定位翻转(与0异或保持原值,与1异或取反)。 例如:要使01111010低四位翻转: 01111010 (^)00001111 01110101
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:00000010101 例1 ~025:11111101010 例2:将int型数据a最低位置0: a=a&~1 例2 (~1是:11..10) (当a是16位或32位整数时都适用)
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
C语言程序设计 清华大学 郑莉 安颖莲 Page 12 位运算——移位 • 左移运算(>) 右移后,低位舍弃, 高位:无符号数补0 有符号数补0(逻辑右移) 补“符号位”(算术右移) 例 3 例 4 例5