一、章节导学
二、进制运算的基础
1. 进制概述
1.1 进制的定义
- 进位制是一种记数方式,亦称进位计数法或位值计数法
- 有限种数字符号来表示无限的数值
- 使用的数字符号的数目称为这种进位制的基数或底数
1.2 常见的进制
n=10 [0-9] 称为十进制
- 计算机喜欢二进制,但是二进制表达太长了
- 使用大进制位可以解决这个问题
- 八进制、十六进制满足2的n次方的要求
1024=0x400=0o2000=0b1000000000
2. 二进制运算的基础
- 正整数N,基数为r
例1
例2
2.1 (整数)二进制转换十进制:按权展开法
例1
例2
2.2 (整数)十进制转换二进制:重复相除法
例1
2.3 (小数)二进制转换十进制:按权展开法
例1
例2
2.4(小数)十进制转换二进制:重复相乘法
例1
三、有符号数与无符号数
问:怎么判断他是数字位还是符号位呢?
答:使用0表示正数,使用1表示负数
1. 原码表示法
1.1 原码表示法
- 使用0表示正数、1表示负数
- 规定符号位位于数值第一位
- 表达简单明了,是人类最容易理解的表示法
1.2 原码表示法的问题
0有两种表示方法:00、10
原码进行运算非常复杂,特别是两个操作数符号不同的时候
- 判断两个操作数绝对值大小
- 使用绝对值大的数减去绝对值小的数
- 对于符号值,以绝对值大的为准
1.3 希望的改进
- 希望找到不同符号操作数更加简单的运算方法
- 希望找到使用正数代替负数的方法
- 使用加法操作代替减法操作,从而消除减法
四、二进制的补码表示法
1. 补码的定义
例子1:,,计算x的二进制原码和补码
原码:,补码:
例子2:,计算的二进制原码和补码
原码:,补码:
补码:
例子3:例子3:,计算的二进制原码和补码
原码:,补码:
补码:
例子4:,计算的二进制原码和补码
原码:,补码:
补码:
五、二进制的反码表示法
1. 引进补码的目的
- 减法运算复杂,希望找到使用正数替代负数的方法
- 使用加法代替减法操作,从而消除减法
- 在计算补码的过程中,还是使用了减法!!
- 反码的目的是找出原码和补码之间的规律,消除转换过程中的减法
2. 反码的定义
例子1:,计算的二进制原码和反码
原码:,反码:
反码:
例子2:例子3:,计算的二进制原码和反码
原码:,反码:
反码:
- 负数的反码等于原码除符号位外按位取反
- 负数的补码等于反码+1
例子1:,计算x的二进制原码和反码和补码
原码: 反码: 补码:
例子2:,计算x的二进制原码和反码和补码
原码: 反码: 补码:
六、小数的补码
例子1:,计算的二进制原码和反码和补码
原码: 反码: 补码:
例子2: ,计算的二进制原码和反码和补码
原码: 反码: 补码:
七、定点数与浮点数
1. 定点数的表示方法
-
小数点固定在某个位置的数称之为定点数
2. 浮点数的表示方法
2.1 为什么使用浮点数
- 计算机处理的很大程度上不是纯小数或纯整数
- 数据范围很大,定点数难以表达
2.2 浮点数的表示方法
浮点数的表示格式
1.2345:尾数
10:基数 11:阶码
S:尾数 r:基数 j:阶码
尾数规定使用纯小数
浮点数的表示范围
假设阶码数值取位,尾数数值取位
阶码能够表示的最大值:,考虑符号位:
尾数能够表示的最大值:
尾数能够表示的最小值:
尾数表示范围: ,考虑符号位:
阶码表示范围:
尾数表示范围:
单精度与双精度浮点数
单精度浮点数: 使用4字节、32位来表达浮点数(float)
双精度浮点数: 使用8字节、64位来表达浮点数(double)
2.3 浮点数的规格化
- 尾数规定使用纯小数
- 尾数最高位必须是1
正确:
错误:
错误:
错误:
例子1:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数 表示为二进制浮点数。
原码=反码=补码:
浮点数规格化:
尾数为,尾数符为,阶符为,阶码为
例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数−54表示为二进制浮点数。
原码:
浮点数规格化:
尾数为,尾数符为,阶符为,阶码为
尾数反码,尾数补码
3. 定点数与浮点数的对比
- 当定点数与浮点数位数相同时,浮点数表示的范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数
八、定点数的加减法运算
数值位与符号位一同运算,并将符号位产生的进位自然丢掉
溢出判断,单符号位表示变双符号位,双符号位产生的进位丢弃,结果的双符号位不同则表示溢出
1. 整数加法
例子1:A=-110010, B=001101,求A+B
例子3:A=-10010000, B=-01010000,求A+B
2. 小数加法
例子2:A=-0.1010010, B=0.0110100,求A+B
例子4:A=-10010000, B=-11010000,求A+B
发生了溢出
3. 判断溢出
3.1 双符号位判断法
- 单符号位表示变成双符号位:0=>00,1=>11
- 双符号位产生的进位丢弃
- 结果的双符号位不同则表示溢出
例子4:A=-10010000, B=-11010000,求A+B
双符号位不同,表示溢出
例子3:A=-10010000, B=-01010000,求A+B
双符号位相同,没有溢出
4. 整数减法
-B[补]等于B[补]连同符号位按位取反,末位加一
B[补] = 1,0010101,(−B)[补] = 0,1101011
例子5:A=11001000, B=-00110100,求A-B
5. 小数减法
九、读点书的加减法运算
- 对阶
- 尾数求和
- 尾数规格化
- 舍入
- 溢出判断
1. 对阶
対阶的目的是使得两个浮点数阶码一致,使得尾数可以进行运算
- 浮点数尾数运算简单
- 浮点数位数实际小数位与阶码有关
- 阶码按小阶看齐大阶的原则
2. 尾数求和
- 使用补码进行运算
- 减法运算转化为加法运算:A - B = A + (-B)
3. 尾数规格化
- 对补码进行规格化需要判断两种情况:S>0和S<0(符号位与最高位不一致)
- 如果不满足此格式,需要进行左移,同时阶码相应变化,以满足规格化
(左移)
4. 尾数规格化(右移)
- 一般情况下都是左移
- 双符号位不一致下需要右移(定点运算的溢出情况)
- 右移的话则需要进行舍入操作
4.1 舍入
- “0舍1入”法(二进制的四舍五入)
可能溢出
4.2 溢出判断
- 定点运算双符号位不一致为溢出
- 浮点运算尾数双符号位不一致不算溢出(因为尾数双符号位可以进行右规)
- 浮点运算主要通过阶码的双符号位判断是否溢出(如果规格化后,阶码双符号位不一致,则认为是溢出)
例子:,假设阶码4位,尾数8位,计算x + y
5. 浮点数加减法运算
九、浮点数的乘除法运算
1. 浮点数乘法
2. 浮点数除法
例子:,假设阶码4位,尾数8位,计算x * y
十、巩固习题
1.除了十进制以外,这个世界上常见的还有什么进制?
二进制、八进制、十二进制、二十进制、六十进制。
2.二进制一般使用什么方法转换成十进制?
整数:按权展开法。
3.十进制一般使用什么方法转换成二进制?
整数:重复相除法,小数:重复相乘法。\
4.计算机直接使用原码计算有什么缺点?
0有两种表示方法,减法运算复杂。
5.请计算12、124、1023、-1、-127的二进制原码。
12(0,00001100)、124(0,01111100)、1023(0,1111111111)、-1(1,00000001)、-127(1,01111111)。
6.计算机的补码解决了什么问题?
相比原码的运算过程(特别是减法),补码对于计算机而言运算更加简单。
7.请计算12、124、1023、-1、-127的补码,并将其使用32位定点表示法和32位浮点表示法(1位符号位、8位阶码、23位数值位)表示出来。
8.你是否可以使用代码实现一个通用的计算器,可以将二进制数转换为十进制数,把十进制数转换为二进制数。
9.计算机为了判断运算溢出使用了什么方法?
双符号位判断法。当双符号位不一致表示溢出。
10.什么是溢出?什么是上溢?什么是下溢?
溢出即计算机无法表示数值。上溢是指数值绝对值大于表示范围,下溢是指计算机无法提供有效精度表示数值。
11.对于64位浮点型(double),一般都是采用最高位为符号位,次高11位为指数位,其次52位为尾数,试求出double型所能表达的最大值和最小值。
12.浮点数相比定点数,有什么优势?有什么不足的地方。
浮点数可以表示更大的数据范围,但是运算耗时更长。
13.浮点数之间做加减法运算需要几个步骤?每个步骤都是必须的吗?为什么?
浮点数加减法需要经过以下几个步骤:对阶、尾数求和、尾数规格化、舍入、溢出判断。对阶是为了使得尾数可以进行运算,阶码不一致尾数运算无效,尾数规格化、舍入是为了正确存储结果,溢出判断是为了判断运算过程是否有误,如果溢出将会发出信号进行溢出处理。
14.x=0.1101^1001, y=0.1011^110,请计算x+y的值,x-y的值。
x+y=0.11100111001,x-y=0.10111011001。
15.x=0.1101^111, y=-0.1111^1101,请计算x+y的值,x-y的值。
x+y=-0.11101100111101,x-y=0.11110011011101。