导图社区 数据的表示和运算-计算机组成原理第2章
数据的表示和运算-计算机组成原理第2章:定点数移位运算:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。
编辑于2022-10-18 23:36:02 江苏省第二章 数据的表示和运算 计算机组成原理 王道考研系列
数制与编码
进位计数制
常见进制
基数,每个数码位所用到的不同符号的个数,r进制的基数为r,逢r进1
十进制(D),二进制(B),八进制,十六进制(H,0x)
其他进制转为十进制
r进制数的数值=各数码位与位权的乘积之和
二进制,八进制,十六进制之间的相互转换
每三个二进制对应一个八进制位
每四个二进制位对应一个十六进制位
注意“补位”
十进制转为其他进制
整数部分
除基取余法:先取得的“余”是整数的低位
小数部分
乘基取整法:先取得的“整”是小数的高位
真值和机器数
真值:符合人类习惯的数字
机器数:数字实际存到机器里的形式,正负号需要被“数字化”
BCD码
8421码
每4个二进制位对应一个十进制位(有6个冗余状态)
8、4、2、1分别对应每一位的权值
0000~1001分别对应0~9,进行加法后若超出该范围,则需+0110进行修正(强制向高位进1)
余3码
8421码+(0011)
2421码
权值是2、4、2、1
2421码规定 0~4的第一位是0,5~9的第一位是1
无符号整数的表示和运算
无符号整数
全部二进制为都是数值位,没有符号位,第i位的位权是
n bit 无符号整数表示范围0~-1,超出即溢出,意味着该计算机无法一次处理这么多
可以表示的最小的数 全0,可以表示的最大的数 全1
计算机硬件如何做无符号整数的加法
从最低位开始,按位相加,并往更高位进位
计算机硬件如何做无符号整数的减法
“被减数”不变,“减数”全部位按位取反,末位+1,减法变加法
从最低位开始,按位相加,并往更高位进位
带符号整数的表示和运算
带符号整数的表示
原码
符号位“0/1”对应“正/负”,剩余的数值位表示真值的绝对值
若机器字长n+1位,带符号整数的原码表示范围:-(-1)≤x≤-1
真值0有两种表现形式
+0,[+0]=0,0000000;
-0,[-0]=1,0000000;
原码的缺点:符号位不能参与运算,需要设计复杂的硬件电路才能处理,费钱!贵!
补码
正数:补码和原码,反码一致
负数:反码的末位+1
更快速的方法(手算)
正数:不变
负数:从右往左找到第一个1,这个1左边的所有“数值位”按位取反
逆向转换,方法一样
补码的数值位不能解读为“位权”
反码
正数:反码和原码,补码一致
负数:原码的符号位不变,数值位取反
补码的加法运算
从最低位开始,按位相加(符号位参与运算)并往更高位进位,超出的部分舍弃
补码的减法运算
“被减数”不变,“减数”全部位按位取反、末位+1,减法变加法
从最低位开始,按位相加,并往最高位进位
原/反/补码的特性对比
常见考点
两个数A和B进行某种运算后,是否发生溢出?——手算做题可以带入十进制验证,是否超出合法范围
移码
补码的基础上,符号位取反
注意:移码只能用于表示整数
真值0只有一种表示形式 [0]=10000000
若机器字长n+1位,移码整数的表示范围:-2≤x≤2-1(与补码相同)
真值增大,移码增大
移码表示的整数很方便用于硬件串路比较大小
移码常用于浮点数阶码
定点小数的表示和运算
定点数
定点整数:带符号整数
定点小数
小数不可以用移码表示
表示方法,运算方法,各种码制的转换方式与整数相同
运算方法和运算电路
算数逻辑单元
ALU
实现算数运算、逻辑运算、辅助功能(移位、求补等)
基本结构:输入、输出、控制
电路基础知识
逻辑运算
与、或、非
与非、或非、异或、同或
门电路
最基础的逻辑元件,用于实现逻辑运算
逻辑表达式就是电路的数学化表示。根据逻辑运算的规则对逻辑表达式进行优化,也就是在优化电路
加法器的实现
一位全加器的设计
本位和
本位向高位的进位
串行加法器
一位全加器+进位触发器,只能一位一位地加
串行进位的并行加法器
多个全加器简单串联,可多位同时加
计算速度取决于进位产生和传递的速度
回忆:各种门电路的图形,全加器的图形和输入输出信号
加法器、ALU的改进
串行进位的并行加法器
把n个全加器串接起来,就可进行两个n位数的相加。
如何更快的产生进位?
结论:第 i 位向更高位的进位 Ci可根据 被加数、加数的第 1~i 位, 再结合C0即可确定
并行加法器的优化
各级进位信号同时形成,又称为先行进位、同时进位
标志位的生成
OF(溢出标志)
有符号数的加减运算是否发生了溢出,OF=1时,说明发生了溢出
硬件的计算方法:OF=最高位产生的进位⊕次高位产生的进位
注意:OF位对无符号数的加减法无意义
SF(符号标志)
有符号数加减运算结果的正负性,SF=0表示运算结果为正数,SF=1表示运算结果为负数
硬件的计算方法:SF=最高位的本位和
注意:SF位对无符号数的加减法无意义
ZF(零标志)
表示运算结果是否为0.ZF=1表示运算结果为0,ZF=0表示运算结果非0
硬件的计算方法:两个数的运算结果为n bit,只有n bit全为0时,ZF=1
CF(进位/借位标志)
表示无符号数的加减法是否发生了进位或借位。当CF=1时,说明无符号数加减运算发生了进位或借位,也即发生了溢出
硬件的计算方法:CF=最高位产生的进位⊕sub
sub=1表示减法
sub=0表示加法
注意:CF位对有符号数的加减法无意义
仅对无符号数加减法有意义
仅对有符号数加减法有意义
定点数移位运算
通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权
小数点后移1位相当于×10
小数点前移1位相当于÷10
算术移位
原码
符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差
反码
正数:与原码相同
负数:
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
补码
正数:与原码相同
负数:
负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
右移:高位补1,低位舍弃
左移:低位补0,高位舍弃
逻辑移位
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
循环移位
不带进位位
用移出的位补上空缺
移出的位放到进位位
带进位位的循环左移
移出的位放到进位位
原进位位补上空缺
由于原、反、补码位数有限,因此某些时候算术移位不能精确等效乘法、除法
定点数的乘、除法运算
乘法运算
乘法运算的实现思想
原码的一位乘法
符号位单独处理:符号位=两个数符号位的异或
数值位取绝对值进行乘法计算
实现方法:先加法再移位,重复n次
机器实现原理
在正式进行乘法之前,ACC置0
判断MQ中,当前参与乘法的一个位
当前位=1,则ACC加上被乘数
当前位=0,则ACC加上0
算完一位后,将ACC和MQ逻辑右移一位
逻辑右移,高位补0
ACC的低位移到MQ
MQ原来的最低位用不到了,直接丢弃
重复第二步,直到MQ运算到乘数的符号位,乘数的符号位不参与计算
修改符号位为原两个符号位的异或
手算模拟
补码的一位乘法
补码乘法中使用“双符号位补码”
进行n轮加法、移位,最后再多来一次加法
在MQ增加了一位辅助位,根据MQ中的最低位和辅助位来确定加什么
手算模拟
除法运算
除法运算的思想
规律:忽略小数点,每确定一位商,进行一次减法,得到4位余数,在余数末尾补0,再确定下一位商。确定5位商即可停止(机器字长为5位)
原码除法:恢复余数法
符号位单独处理:符号位=两个数符号位的异或
数值位取绝对值进行乘法计算
实现方法:上商0/1,得到余数,余数末尾补0
机器实现原理
计算机很傻,会默认上商1,如果搞错了再改上商0,并“恢复余数”
首先上商1,让ACC与负除数的补码相加,如果此时符号位为1,说明搞错了,恢复余数
将ACC和MQ整体逻辑左移,ACC高位丢弃,MQ低位补0
重复上述步骤,直到MQ被商填满
余数是ACC剩下的数乘2
手算模拟
左移n次,上商n+1次,最后一次上商余数不左移
原码除法:加减交替法(不恢复余数法)
若余数为负,可直接商0,并让余数左移1位再加上|除数|,得到下一个新余数
若余数位正,则商1,让余数左移1位再减去|除数|,得到下一个新余数
手算模拟
余数的正负性与商相同
最后一步时若余数为负,需商0,并+[|y|]得到正确余数
加/减n+1次,每次加减确定一位商;左移n次(最后一次加减完不移位)最终可能还要再多一次加
补码除法:加减交替法
符号位参与运算
被除数/余数、除数采用双符号位
运算过程
最开始
被除数和除数同号,则被除数减去除数;
异号则被除数加上余数
余数和除数同号,商1,余数左移一位减去除数;
余数和除数异号,商0;余数左移一位加上除数;
重复n次
末位商恒置1
精度误差不超过2
浮点数的表示与运算
浮点数的表示
浮点数的作用和基本原理
阶码E反映浮点数的表示范围及小数点的实际位置
尾数M的数值部分的位数n反映浮点数的精度
阶码:常用补码或移码表示的定点整数
尾数:常用原码或补码表示的定点小数
浮点数规格化
规格化浮点数:规定尾数的最高数值位必须是一个有效值 。
左规:当浮点数运算的结果为非规格化时要进行规格化处理,
右规:当浮点数运算的结果尾数出现溢出(双符号为01或10)时,
注:采用“双符号位” ,当溢出发生时,可以挽救。更高的符号位是正确的符号位
规格化的原码尾数,最高数值位一定是1
规格化的补码尾数,符号位与最高数值位一定相反
浮点数的表示范围
IEEE754标准
阶码用移码表示
移码=真值+偏置值
令偏置值=127D,即2-1
浮点数的加减运算
加减运算
对阶
使两个数的阶码相等,小阶向大阶看齐,尾数每左移一位,阶码加1
求阶差
对阶
尾数加减
通常用双符号位,可以拯救溢出
规格化
左归
尾数最高数值位为无效位时,尾数左移,阶码减1
右归
尾数双符号位不同时,尾数右移,阶码加1
舍入
0舍1入法
在尾数右移时,被移去的最高数值位为0,则舍去
被移去的最高数值位为1,则在尾数的末位加1,这样做可能会使尾数又溢出,此时需再做一次右规
恒置1法
尾数右移时,不论丢掉的最高数值位是1还是0,都使右移的尾数末位横置1,这种方法同样有使尾数变大和变小的两种可能
溢出判断
阶码上溢
抛出异常(中断)
阶码下溢
按机器0处理
采用双符号位,可拯救尾数溢出
强制类型转换
char → int → long → double
float → double
int → float:可能会损失精度(float尾数的数值位有1+23位)
float → int:t可能会溢出,也可能会损失精度(如小数转整数)
精度从小到大,转换过程中没有损失
其余内容
C语言里的强制类型转换
C语言里的定点整数是用“补码”存储的
无符号数与有符号数:不改变数据内容,改变解释方式
长整数变短整数:高位截断,保留低位
短整数变长整数:符号扩展
数据的存储与排列
大小端模式
大端方式:高地址存最高有效字节,低地址存最低有效字节
小段方式:高地址存最低有效字节,低地址存最高有效字节
边界对齐
现代计算机通常是按字节编址,即每个字节对应一个地址
通常也支持按字,按半字,按字节寻址