原码,反码和补码
-
原码表示法:
用一位符号位和二进制的绝对值表示数值。 -
补码表示法:
由于使用原码表示法对计算机来说比较复杂,如进行减法要先将两数的绝对值进行相减,然后选择正确的符号,所以引入了补码表示法的概念。 -
反码
使用了补码 计算机不论数值的正负都可以使用加法来解决,提高了计算机的工作效率,但是负数的补码依然要用减法来解决,所以引入了反码来解决问题。 -
模
提到补码表示法就要提到模的概念,模就是数值的最大值,它像一个圆圈一样,比如 25 加上 75 等于 100, 我们假设 100 为模, 那么 25 加上175 就相当于转了一圈,结果依然等于100 , 25 减去 75 则等于 50。这就像一个头尾相连的圈一样;转一圈是360° ,这里的360° 就是一个模,正方向转90° 和逆方向转270° 的效果是一样的,而对于计算机而言则少了判断符号的过程,大大提高了效率。 - 正数的原码,反码和补码都相同
-
负数的原码符号位用1表示,
反码为除了符号位的其他各位取反,1为0,0为1,
补码在反码的基础上在末尾加1 。
例如:
(-35)原 = 1010 0011
(-35)反 = 1101 1100
(-35)补 = 1101 1101
(-1)原 = 1000 0001
(-1)反 = 1111 1110
(-1)补 = 1111 1111
-
关于原码补码的范围,
[参考这篇博文]
。
浮点表示法
一个十进制的数N可以表示成:
- N = 10 ^ e . M
同样二进制数也可以表示成:
- N = 2 ^ e . M
M 叫浮点数的尾数,计算机中尾数部分表示有效位数
e 叫比例因子的指数,十进制对应的比例因子的基数是10,二进制对应的比例因子的基数是2;
按照计算机的IEEE754标准,有32位和64位标准格式:
32位标准格式:
S | E | M |
---|---|---|
1位 | 8位 | 23位 |
符号位 | 阶码 | 尾数位 |
64位标准格式:
S | E | M |
---|---|---|
1位 | 11位 | 52位 |
符号位 | 阶码 | 尾数位 |
将 指数e 变为 阶码E 采用
移码方法
:在e上加一个固定的偏移值127(0111 1111),
E = e + 127
.
例题:
用IEEE32位浮点格式表示以下的数:(1)-5 (2)-1.5
(1)-5:
-5 = (-101)B = (- 1.01 x 2 ^ 2)B;
S = 1, M = 01 , e = 2 , E = e + 127 = 129 = (1000 0001)B;
所以(-5)的32位浮点格式为:(
1
1000 0001
010 0000 0000 0000 0000 0000
)B = (
C0A00000
)H;
(2)-1.5:
-1.5 = (-1.1)B = (-1.1 x 2 ^ 0)B;
S = 1, M = 1, e = 0,E = e + 127 = 127 = (0111 1111)B ;
所以(-1.5)的32位浮点格式为:(
1
0111 1111
100 0000 0000 0000 0000 0000
)B = (
BFC00000
) H;
M为有效位,即得到的二进制数在第一个1后取小数点,小数点后的数值就是有效位。
定点算数运算
补码加减法
- 补码加法的公式:
(x)补 + (y)补 = (x + y)补
- 补码减法的公式:
(x)补 - (y)补 = (x - y)补 = (x)补 + (- y)补
其中
(- y)补 = - (y)补
,证明过程省略;具体过程:
(-y)补= - (y)补 + 1
(对(y)补 包括符号位在内的数值求反,并在末尾处加1)
溢出及检测方法
- 两个正数相加的结果大于机器所能表示的最大数叫“正溢出”;
- 两个负数相加的结果小于机器所能表示的最小数叫“负溢出”。
检测方法:双符号法 (又叫做变形补码)
正数的符号位为“00”,负数的符号位为“11”,符号位参与运算,并且符合运算规律。
结果相加后,两个符号位上出现“01”表示正溢出,出现“10”表示负溢出,最高符号为上显示的正确的符号,运算中最高符号位产生的进位丢掉。
在定点机中,系统产生溢出表示出错,机器通过逻辑电路自动检查出这种溢出并且中断程序。
定点乘法运算
原码并行乘法
原码的乘法规则:
符号位单独运算,通过异或运算求出,相异为1(负),相同为0(正)。数值部分为绝对值乘积。
-
不带符号的阵列乘法
FA为一位全加器(加数,被加数和低位进位为输入,和数和进位为输出)
无符号阵列乘法器逻辑电路图:(斜线代表低位向高位进位,竖线代表和数作被加数,横线代表加数)
-
带符号的阵列乘法器
前面提到不带符号的阵列乘法器相当于数的绝对值相乘,而数的相乘必定会带有符号,所以需要用到求补器。
求补器有算前求补器和算后求补器
算前求补器的作用:将乘数和被乘数通过求补的方法变成绝对值;(如果乘数和被乘数都是正数则不需要算前求补,如果乘数为负数,那乘数的算前求补器对其进行求补)
算后求补器的作用:当输入的两个操作数符号不同时,将输出结果变成有符号的数值
在原码乘法中,算前求补和算后求补都不需要,输入的数据可以立即使用,但是在补码乘法阵列中要用到三个求补器(乘数和被乘数的求补器以及算后求补器),求出的结果为补码,所以使用算后求补器再次求补转为原码就是最终结果;
【不带符号的阵列乘法器可以当成是不考虑有负数相乘的乘法器,带符号的阵列乘法器则是考虑到有负数相乘,所以结果带有符号而需要使用求补器来协助的乘法器】
补码并行乘法
补码乘法符号位不单独运算,直接参与乘法,对于计算补码的数值,比较好的表示方法是使补码的数带有负权值的符号和正权值的系数。
关于权值【
参考这篇文章
】
-
直接补码阵列乘法器
使用混合型的全加器构成直接补码阵列乘法器,乘数与被乘数是二进制补码,由于直接补码阵列乘法器的符号位参与运算比较复杂,不作过多释述。【
参考这篇博文
】
定点除法运算
原码除法运算
规则:符号位依然独立运算,采用异或处理,异号为1(负),同号为0(正),数值部分为绝对值除法运算。
手算方法
:
- 先来参考十进制的除法运算:
二进制小数算法:
计算机运算方法
-
恢复余数法
计算机进行原码除法计算时不能像人一样直接比较数的的大小判断余数是否够减,因此计算机直接进行减法操作,余数为负判断为不够减,返回上一步,这叫做恢复余数法;由于比较繁琐,所以一般计算机采用不恢复余数法,也叫做加减交替法; -
加减交替法
这种方法是选择将两个操作数乘比例因子变成小数再进行计算,余数为负时,商位填0;余数为正时,商位填1;加减交替法的规律是先减后加,余数为负下一步进行加法,余数为正下一步进行减法。
运算器
运算器包括ALU,阵列乘法器,寄存器,多路开关,三台缓冲器,数据总线等逻辑部件。
-
单总线结构的运算器
在同一时间,只能有一个操作数放在单总线上,为了把两个操作数输入到ALU,需要分两次来做,而且还需要两个缓冲寄存器。 -
双总线结构的运算器
两个操作数可以同时加入到ALU中,只需要一次操作就可以,而且可以马上运算出结果。 -
三总线结构的运算器
两个操作数由两条总线供给,输出结果由第三条总线供给,这样算数逻辑操作可以在一步之内完成,并且还设置了一个
总线旁路器
(总线2和总线3的之间的数据桥,如果后续的运算中有一个操作数不需要修改,那么可以通过数据桥之间传送到ALU中)
这三种运算器的特点是总线越多,操作时间就越快,但同时成本也就越大。
浮点运算法
浮点加减法
浮点加减法运算由以下四个操作阶段构成:
-
0操作数检查
判断两个操作数中是否有0,如果有则可以直接得知结果,不需要下面的步骤,以节省时间; -
比较阶码大小完成
对阶
两个浮点数进行运算首先要看阶码是否相同,
也就是看小数点有没有对齐
;
用十进制来举例,10.32和1.3612相加对计算机而言不能直接对齐小数点,计算机会按照数值的位数对应进行加减法,所以得出的数值是14644,而小数点的位置则会未知;
对阶码首先要求出两阶码的差:Ex – Ey,在对阶时总是
小阶向大阶看齐
,也就是
小数点向左移,比较小的阶码则会变大,直到与比较大的阶码相等为止。
-
尾数求和运算
对阶完成后,有效数进行加法运算,与定点加减法操作相同。 -
结果格式化
在浮点加减运算时,尾数求和的是01.xxxxxx或者10.xxxxxxxx在定点加减法运算中称为溢出,但是在浮点加减法运算中,这表示运算结果的绝对值大于1,这时通过将尾数右移实现规格化,称为
向右规格化
,尾数向右移一位,阶码加1;当尾数不是1.M的形式时,
向左规格化
,也就是尾数向左移。 -
舍入处理
在对阶或向右规格化结束后,尾数向右移则需要丢掉尾数的低位部分,所以要进行
舍入处理
。
这里有四种舍入处理的方法:
a.
就近舍入
:通常所说的“四舍五入”,
多余位的值超过规定的最低有效位值的一半,最低有效位值加1
.
例如: IEEE 32位标准化格式尾数位为23位,假设超出23位的多余位数字是10010,它的十进制值为18,最低有效位值是100000,换算成十进制值是32,18大于16,所以最低有效位值需要加1.
b.
朝0舍入
:直接截尾;截尾导致尾数取值比起原值的绝对值小,所以这种方法容易导致误差累积。
c.
朝+∞舍入
:对于正数来说,只要多余位不全为0,则向最低有效位进1;对于负数来说则是直接截尾。
d.
朝-∞舍入
:对于负数来说,多余位不全为0则向最低有效位进1;对于正数来说则是直接截尾。 -
溢出处理
浮点数的溢出由其阶码表现出来的,如果阶码正常,则浮点加减法正常进行;如果阶码溢出,则需要对解码进行处理,并且对尾数也进行处理。
a.
阶码上溢
:超过了阶码可以表示的最大值的正数指数,将其看作是∞。
b.
阶码下溢
:超过了阶码可以表示的最小值的负数指数,将其看作是0。
c.
尾数上溢
:两个操作数相加产生最高位进1,这时需要将小数点向左移1位,阶码值加1 来重新对齐阶码。
d.
尾数下溢
:在尾数右移以后,也就是小数点左移之后,尾数的最低有效位应该流出,也就是算入多余位里,要进行舍入处理。
浮点乘除法运算
浮点乘法的运算规则:
x
x
y
= 2 ^ (
Ex
+
Ey
) x (
Mx
x
My
);
浮点除法的运算规则:
x
÷
y
= 2 ^ (
Ex
–
Ey
) x (
Mx
÷
My
);
浮点乘除法运算步骤
-
0操作数检查
被除数也就是x为0,结果为0;除数也就是y为0,结果为∞。乘法中只要有操作数为0,结果为0. -
阶码加减操作
浮点乘除法运算中,阶码主要有加1,减1,两阶码相加,两阶码相减四种操作,并且运算时要检查是否溢出。 -
尾数处理
对结果的规格化和舍入处理同浮点加减法;
a.
截断处理
,直接丢掉多余位的数值,但是这种方法影响结果的精度。
b.
舍入处理
,保留多余位上高位的值,再按照某种规则利用这些值来修正尾数位上的值。
尾数是原点时,舍入规则比较简单;
最简单的方法
:只要尾数最低位是1或者多余位里有1,那么尾数的最低位为1 。
0舍1入法
:当多余位的最高位是1,就在尾数位的最低位上加1。
浮点运算流水线
定义:
把输入的任务分割成一系列子任务,使各个子任务能在流水线的各个阶段并发执行,将任务连续不断的输入到流水线,从而完成子任务级的并发执行。
并行有两种基本形式:
空间并行:资源重复;
时间并行:流水技术;
- 线性流水线:各个子任务之间具有优先关系,后边的任务要在前面的任务完成之前才能进行,这是一种具有线性优先关系的流水线
- 过程段:处理一个子任务的过程叫过程段。线性流水线是由一段串联的过程段组成的,每个过程之间设有高速的缓冲寄存器来暂时保存上一个任务的处理结果,在一个统一的时钟控制下,数据从一个过程段流向下一个过程段。
-
线性流水线的时钟周期:
确定线性流水线的时钟周期是流水线的关键
线性流水线的时钟周期(τ)
=
缓冲寄存器的延时最大值(τmax)
+
过程段所需要的时间(τt)
所以线性流水线的处理频率就是线性流水线时钟周期的倒数
:
f = 1 / τ
。 -
一个k级阶段的流水线处理n个任务的时钟周期数Τk:
Τk
=
k
+
(n – 1)
-
非流水线的硬件完成n个任务的时钟周期数Tl:
Tl
=
n
x
k
-
k级线性流水线的加速比:
Ck
=
Tl
/ Tk =
n * k
/
k + (n – 1)
流水线浮点加法器
浮点数加法操作由0操作数检查,对阶操作,尾数操作,结果规格化及 舍入处理4步组成;
所以流水线浮点加法器由4个过程段组成。
浮点运算器实例
-
CPU外的浮点运算器
早期微型计算机把浮点运算器放在CPU外,这里不作过多叙述,美国Intel公司生产的80×87为处理浮点数等数据的算术运算和多种函数计算而设计生产的专用算术运算处理器。
2.CPU内的浮点运算器
奔腾CPU将浮点运算器包含在芯片内,浮点运算部件采用流水线设计。
随着高密度集成电路技术的发展,浮点运算器已经移入CPU内部;对浮点运算器介绍不多,可以参考
这篇文章
或自行查找了解。
参考书目:计算机组成原理-第五版-白中英