导图社区 计算机组成原理_数据的表示和运算
详细总结了数据表示和运算的知识结构,帮助同学总体把握本章知识重点、加深理解, 希望对大家有所帮助~
编辑于2022-03-19 15:54:39数据的表示和运算
2.符号拓展
整数
正数
在 符号位 和 数值位 之间填加 0
负数
原码
反码、补码
符号位 和 数值位 之间添加 1
小数
正数
在 数值位 之后添加 0
负数
原码、补码
反码
在数值位之后添加 1
3.定点数
小数点固定的数
定点整数
定点小数
移位运算
算数移位
对象:有符号数
前提:符号不变
本质
左移
如果丢失0,相当于×2
如果丢失1,产生严重误差
右移
如果丢失0,相当于÷2
如果丢失1,精度降低
原码(空位补0)
反码
正数:空位补0
负数:空位补1
补码
正数:空位补0
负数:
左移补0
右移补1
逻辑移位
前提:符号位参与移位
空位均补0
循环移位
带CF
CF不参与循环移位,移出的位补在空缺上
不带CF
CF参与循环
定点数的运算2常规运算
原码
加
同号:符号位不变,数值位相加
异号:绝对值大的-绝对值小的,符号同绝对值大的
减
将减数取负,变成加法
X-Y=【X+[-|Y| ]补】
按补码减法计算
乘(累加+右移)
符号位不参与,结果取乘数和被乘数符号的异或
1.初始,部分积(ACC)取0;乘数Y(共n位)存放在MQ;被乘数X存在寄存器X
2.判断Y的最后1位Yn
=1,则ACC+|X|
=0,则ACC+0
3.部分积、乘数,进行算数右移1位(ACC中的数值向右移动到MQ中,MQ中的乘数同时右移,自动丢失最后1位)
4.重复步骤2、3,共n次,最后一次得到的部分积(ACC)与此时MQ中存放的部分积低位相拼接,附上符号,得到结果
除(累加+左移)
符号位不参与,结果取乘数和被乘数符号的异或
1.初始:被除数X存放在ACC,商存放在MQ=0;除数Y放在寄存器X中
2.先用被除数X-Y=【X+[-|Y| ]补】
得到余数,存放在ACC
3.判断余数
正:商上1;余数ACC和商MQ算数左移1位,MQ的空位先=0
ACC+[-|Y| ]补
负:商上0;余数ACC和商MQ算数左移1位,MQ的空位先=0
ACC+|Y|
4.重复步骤3,重复n次,第n+1次只进行到商值的改变,即得到正确的 商MQ
若第n+1次余数为 负 时,ACC需要在 + |Y|,得到正确的余数
补码
加
同号:同原码的加法
异号:变成减法,同补码减法操作
减
[A-B]补 = [A]补 - [B]补 = [A]补 + [-B]补
乘(累加+右移)
符号位参与运算
1.初始:部分积(ACC)取0;乘数 [Y]补(共n位)存放在MQ;被乘数 [X]补 存在寄存器X;设置辅助判断位Y(n+1)=0【在乘数最后一位后面再拓展1位】
2.判断【Y(n+1) - Yn
=1,则ACC+[X]补
=0,则ACC+0
=-1,则ACC+[-X]补
3.ACC、MQ算数右移1位
4.重复2、3步骤n次,然后到第n+1次只进行2步骤,而后拼接ACC和MQ
除(累加+左移)
符号位参与运算
1.初始,被除数 [X]补 存放与ACC,商存放在MQ=0;除数 [Y]补 放在寄存器X中
2.判断:[X]补 和 [Y]补 :
同号:[X]补 + [-Y]补
异号:[X]补 + [Y]补
得到余数
3.判断余数(ACC)和 除数[Y]补
同号:商上1;余数ACC和尚MQ左移1位,空位暂时补0;ACC+ [-Y]补
异号:商上0;余数ACC和尚MQ左移1位,空位暂时补0;ACC+[Y]补
4.重复步骤3,重复n次,一般将商的末位置1
溢出判断
1位符号位(模2补码)
结果符号判断
上溢:正+正=负
下溢:负+负=正
根据进位情况判断
符号位的进位Cs
数值位的进位C1
V=Cs异或C1
V=1(Cs和C1不相同时溢出)
2位符号位(模4补码)
00为正数,11为负数
结果出现
10为上溢(正溢出)
01为下溢(负溢出)
4.浮点数
浮点数的表示
一般表示
阶符1位,阶码E若干;数符1位;尾数M若干
尾数M
通常用原码、补码表示的二进制定点小数
表示0 .1xxx
阶码E
常用补码、移码表示的定点整数
正数代表小数点后移多少位
负数代表小数点前移多少位
基数r
默认为2
浮点数的真值
N=± r^E × M
规格化
一般浮点表示的规格化
原码
正数
负数
补码正数
尾数M 的最高位必须是 1 【0.1xxxx】
补码负数
尾数M 的最高位必须是 0 【0.0xxxx】
如果不满足规格化,需要做的调整
一般情况
对于原码、补码正数
出现±0.0001的形式
左规
对尾数进行算数左移,每左移1位,E-1,直到变成±0.1xxxx的形式
出现±1.xxxx(尾数的进位跑到小数点左边)
右规
将尾数算数右移1位,E+1,变为±0.1xxxx的形式
对于补码负数
出现±0.1xxx
IEEE 754标准
结果为±0 . 0xxxx
左规若干位,E-若干
结果为±1x . xxxx(尾数向小数点前进了1位)
右规1位,E+1
变为±1.xxxx
IEEE 754标准的规格化
尾数形式为:±1.xxxx
小数点左边的1是隐藏的,实际存储的时候不进行存储
这样的目的是为了尾数能多出1位来存储数据
IEEE 754标准
浮点数格式:数符1位,阶码E若干位,尾数M若干位
常用浮点数类型
float
double
临时浮点数
规定:偏置值(10)=(2^(n-))-1
E 的取值
E的真值(10)=移码(10)-偏置值(10)
float
1~254
double
1~2046
E=0或255或2047时,二进制全是0或者8个1 或者11个1 这些情况的浮点数另作他用
尾数M
纯小数(原码表示),储存的是小数点之后的数
存入时,该小数必须是±1.xxxx形式
存储时,小数点前面的1隐藏
转为十进制
注意E的值,在计算机中是移码,需要换算为真值
常常把E先转换为十进制,然后减去偏置值
float表示的十进制数
(-1)^S + 1.M × 2^(E-127)
double表示的十进制数
(-1)^S + 1.M × 2^(E-1023)
浮点数的加减运算
1.真值到机器数的转换
注意E和M用什么码表示
注意进行符号拓展(拓展为题目规定的位数)
2.对阶
比较两个浮点数的E的大小
小阶向高阶变
阶码+x,尾数算数右移x位
注意当M是补码表示时,如果是负数,右移空位补1
3.尾数加减
常采用双符号位,便于判断尾数溢出
4.规格化(以IEEE 754标准为例)
5.舍入
对阶操作和尾数右规需要考虑的问题
0舍1入
恒置1
溢出判断
尾数溢出(通过规格化解决)
阶码E溢出
上溢:中断处理
下溢:按机器0处理
C语言强制类型转换
无损转换
char-->int-->long-->double
float-->double
有损转换
int-->float
int有1位符号位,31位数值位,float只有23+1位数值位,转换会丢失一部分数据
float-->int
float转int时,系统会直接保留小数点之前的数(整数),后面的数直接丢失,损失精度。如果float所表示的真值二进制数,超过31位,则可能溢出
1.数据的编码
分类
原码(与数据真值相同)
反码(原码各位取反)
补码(反码末位+1)
C语言中所有的数据以补码的形式存储
正数的反码、补码都=原码
移码(补码符号位取反;只能表示整数)
一般在浮点数中表示阶码
容易判断对应真值的大小(谁先出现1,谁对应的真值就大)
移码(10)=真值(10)+偏置值(10)(2^n-1)
真值=移码-偏置值
转换
原码——>反码(各位取反)
反码——>补码(末位+1)
原码——>补码
原码取反+1
快速方法(找到原码中最右边的“1”,把它右边的数字不动抄下来,然后把它左边的所有位取反)
符号位不变
补码——>移码(符号位取反)
判断大小
移码
比较两个移码,看二进制位中谁先出现“1”,那么所对应的真值也大)
反码
补码
对于负数:数值部分越大(小)--->绝对值越小(大)--->真值越大(小)
取值、特殊值
取值范围
原码、反码
整数:-(2^n-1)≤x≤2^n-1
小数:-(1-2^(-n))≤x≤1-2^(-n)
补码
整数:-2^n≤x≤2^n-1
小数:-1≤x≤1-2^(-n)
移码
整数:
小数:不可以表示
特殊值
原码、反码有+0和-0
补码只有一种0:(二进制全为0)
规定:【x】补=1,00000……表示-1
浮动主题