计算机组成原理(2)——数据的表示与运算
二、数据的表示与运算
数据如何表示,运算器如何运算,算的过程如何用电路和硬件来实现。
运算器
考纲要求
1.十、二、八、十六进制数及其相互转换。真值和机器数之间的关系以及BCD码、字符与字符串编码、效验码。
(重点)数据的表示原码、反码、补码、移码以及他们之间的关联与区别。
2.定点数的表示,定点数位移运算、原码定点数加/减运算、补码定点数的加减运算、定点数乘/除运算、溢出概念和判别方法。
3.浮点数的表示(浮点数的表示范围和IEEE754标准)和浮点数的加/减运算。
4.串行加法器和并行加法器、算术逻辑单元ALU的功能和结构。
定点数的表示
定点表示:约定机器中所有数据的小数点位置固定不变。由于约定在固定位置,小数点就不再使用记号“.”来表示。
通常将放到数值位最后面或者最前面,这样的数据表示成纯整数或纯小数。
1 无符号数的表示
用全部二进制代码表示表示数字,没有符号位。
8位二进制无符号数的范围
( 00000000~11111111) 0~2^8-1 (0~255)共256个数
问:为啥是2^8-1?
答:
1111 1111
最低位是 最高位是
1*2^0 ~ 1*2^7
s8 = 1*(1-2^8)/(1-2)
= 2^8-1
或者可以理解为加一位是1 1111 1111 是1*2^8 -1。
2. 有符号数的表示方法
定点数 x= x0 x1 x2 … xn 在机中表示如下(x0为符号位,0代表正号,1代表负号)
对于小数的表示:
小数点位置默认省略掉。
纯小数的表示范围
(x0 x1 x2 … xn 数值位各位均为0时绝对值最小;数值位各位均为1时绝对值最大)
即这些数为: -0.11……1 <= x <= +0.11……1
|n个1| |n个1|
上结论:
0<= | x | <= 1-2^-n
-(1-2^-n) <= | x | <= 1-2^-n
结论是怎么得到的呢?
答:
用八位二进制
2.纯整数的表示
纯整数的表示范围为
(x0 x1 x2 … xn 数值位各位均为0时 绝对值最小;数值位各位均为1时绝对值最大)
结论:
-(2^n-1) <= x <= 2^n -1 (1后面n个0)
0 <= |x| <=2^n-1
即 -11……1 <= x <= + 11……1
比如说32位二进制数,符号位占了一位 数值位占了31位,
问:
机器字长为32位,定点表示时,数符1位,尾数31位。
则:定点整数表示时,
最大正数值 = _________2^31 - 1______________, (011……1)
最小负数值 = ________-2^31 - 1______________。 (11……1)
定点小数表示时,
最大正数值 =__________1 – 2^-31____________, (01……1)
最小负数值 =________-(1 – 2^-31)___________。 (11……1)
十进制加法器可由BCD码(二-十进制码)来设计,它可以在二进制加法器的基础上加上适当的”校正”逻辑来实现,该校正逻辑可将二进制的”和”改编成所要求的十进制格式。
为了便于计算机的运算,必须对二进制的定点数进行合适的编码。
下面讲定点数的机器码表示:
- 原码表示法
原码就是数值的真值(绝对值)前面加上一个绝对值(正数0、负数1)。
若定点小数的原码形式为x0 x1 x2 … xn ,则原码表示的定义是
[x]原 = 0 + |x| = x (1 > x >= 0)
1 + |x| = 1-x (0 >= x >-1)
式中[x]原式机器数,x是真值
例如, x = + 0.1001,则 [x]原 = 0.1001
x = - 0.1001,则 [x]原 = 1.1001
对于0,原码机器中往往有”+0”、”-0”之分,故有两种形式:
[+0]原 = 0.000…0
[-0]原 = 1.000…0
一个n+1位(包括数值位和符号位)定点小数原码的表示范围是
-0.111…11 ~ +0.111…11
| n位 | | n位 |
-( 1 – 2^-n) <= x <= 1-2^n
若 定点整数 的原码形式为 x0 x1 x2 … xn, 则原码表示的定义是
[x]原 = 0 + | x | = x 2^n > x >=0
2^n + | x | = 2^n-x 0 >= x > -2^n
n+1位定点整数原码的表示范围是
-111…11 ~ + 111… 11
| n位 | | n位 |
-(2^n – 1) <= 2^n -1
对于0,原码机器中往往有”+0”、”-0”之分,故有两种形式:
[+0]原 = 0000…0
[-0]原 = 1000…0
n+1位定点整数原码的表示范围
-(2^n - 1) <= x <= 2^n -1
思考: n+1位定点整数原码能表示多少个数?有几个编码?
例如:1个字节8位,2^8 = 256
1位符号位,7位数值位,-127~+127 255个 因为0占了两个编码
(1) x和-x的原码转换
将[x]原的符号位(左端第一位)取反,既可得到[-x]原。
(2) 原码中0的表示不唯一。
纯小数: [+0]原 = 0.00…0, [-0]原 = 1.00…0
纯整数: [+0]原 = 00…0, [-0]原 = 100…0
(3) 若原码字长位n,总共有2^n个编码,但对应的真值只有2^n-1个。
因为[0]原占用了两个编码,因此原码表示范围较小(2^n个编码只能表示2^n-1个真值)。注意与补码的不同。
(4) 若原码字长位n,总共有2^n个编码,但对应的真值只有2^n个。
因为[0]原占用了两个编码,因此原码表示的范围较小(2^n个编码只能表示2^n-1个真值)。注意与后面补码的差异。
(5) 负数原码形式上大于正数的原码:
对于定点小数,当x>0时 0<[x]原<1;
当x<0 时 1<[x]原<2。
对于定点正数,当x>0时, x<[x]原<2^n-1;
当x<0 时, 2^n-1<[x]原<2^n。
(6) 原码的移位规则:
符号位不变,数值部分左移或右移,移出的空位填”0”。(左移一位相当于乘以2,右移一位相当于除以2)
优点:原码简单易懂,与真值转换容易,实现乘除法方便。
(乘除法数值位由两束的绝对值相乘/除得到,符号位由两束的符号位异或即可);
不足:1.原码中0的表示由两种,给使用带来了不便。
2.原码表示的加减法运算复杂,这是因为:当两数相加时如果时同号则数值相加,如果是异号,则进行减法。
2.补码表示法
举例1:假设现在的标准时间位4点正;而有一只表已经7点了,为了校准时间,可以采用两种方法:
将时针退7-4 = 3格;
将时针向后拨9格,7+9(mod 12) = 4。
这两种方法都能校准到4点。
减3和加9是等价的,即9是(-3)对12的
-3 = +9(mod12)
7-3和7+9(mod 12)等价,原因就是表指针超过12时,将12自动丢掉,最后得到16-12=4。从这里可以得到一个启示,就是负数用补码表示时可以把减法转换为加法。
7-3和7+9(mod 12) 等价,9称为-3对12的补码即:
补码的定义就是(mod+真值)
[X]补 = M + X(Mod M)
正数的补数等于本身。
负数的补码等于模与该数绝对值之差。
补码的性质:
(1) 几个特殊数值的补码表示:
0的补码表示
补码的表示范围比原码范围大
纯小数补码比原码多表示一个-1
纯整数补码比原码多表示一个-2^n
这个多表示的数来自于-0,将-0表示为上面的两个数。
所以,补码的表示范围:
8位正数/1位是符号位 7位是数值位
原码 -127~+127 255个数
补码 -128~+127之间 256个数
(3)补码和原码的关系
对于正数直接取其二进制数的表示构成补码。
即 若x>=0,[x]原=[x]补。
若 x<0 符号位不变,各位求反后最低位+1。
注意:补码中特殊数-1(纯小数)和-2^n(纯整数)的表示,在原码中没有对应表示。
(4)[x]补 和 [-x]补 的关系
·已知[x]补,将[x]补的各位(含符号位)取反,然后在最低位上加1,即得到[-x]补。反之亦然。
(5)补码的算数移位规则:
补码的左移(乘2):符号位不变,数值部分左移,最低位移出的空位填0;
补码的右移(除2):符号位不变,数值部分右移,最高位移除的空位填符号位。
(6)负数补码形式上大于正数的补码:
与原码类似
(7)补码的位扩展
例如将字节(8位二进制)表示的补码扩展位16位二进制表示的补码。
定点小数:在最低位用0扩展。
定点整数:在最高位用符号位扩展。
常用求补码的方法(与定义求补码比较):
- 若x>=0 则[x]补=x,符号位为0
若x<0 则将x绝对值的各位取反,然后再最低位上加1,符号位求1,即得到[x]补
- 若x>=0 数值位不变,符号位为0.
若x<0,数值位从最低位开始,对遇到的0和第一个1取其原来的代码,对第一个以后开始直至最高为均按位取反,符号位为1
3.反码表示法
二进制的各位数码0变为1,1变为0.
反码本身就是一个求补码的中间环节。
反码的主要作用就是求补码
对 定点小数,反码表示的定义为
[x]反 = x (1 > x >= 0) (mod(2-2^-n))
(2-2^-n) + x (0 >= x > -1)
其中n代表数的位数。
反码实质上是一种特殊的补码,其特殊支出在于反码的模比补码的模小一个最低位上的1。
对于0,有[+0]反和[-0]反之分
[+0]反 = 0.00…0
[-0]反 = 1.11…1
对于定点整数,反码表示的定义为
[x]反 = x 2^n > x >= 0
(2^n-1 – 1 ) + x 0 >= x > -2^n
反码的特点:
1) 在反码表示中,用符号位x0表示正负,形式与原码表示相同,0为正,1为负
2) 反码中,0 有两种表示形式
纯小数: [+0]反 = 0.00…0 [-0]反=1.11…1
3) 反码的表示范围与原码相同。注意,纯小数的反码不能表示为-1,纯整数的反码不能表示为-2^n
4.移码表示法
补码表示很难直接判断其真值大小。
浮点数的阶码是用移码来表示的。
人的直觉会觉得后面的比前面的大,然而并不是这样,也并没有什么卵用。
移码
模的指数比补码少1.
2^n+1次方
2^n次方
移码通常用于表示浮点数的阶码。由于阶码是个n位的正数,假定定点整数移码形式位x0,x1,x2..xn时,
对定点整数,移码的传统定义是n位数值真值加上一个固定常数2^n
[x]移 = 2^n + x 2^n > x >= -2^n
对定点小数,移码的传统定义是真值加上一个固定常数1
[x]移 = 1+x +1 > x >= -1
若阶码数值部分为7位,以x表示真值,则
[x]移 = 2^7 + x = 128 + x 128 > x >= -128
例如,当正数 x = +1010101时,
[x]移 = 2^7 + 1010101
= 1,0000000 + 1010101
= 1,1010101;
当负数 x = -1010101时,
[x]移 = 2^7 + x = 2^7 – 1010101
= 10000000 – 1010101
= 0,0101011
移码中的逗号不是小数点,而是表示左边一位是符号位。
移码中符号位x0表示的规律与原码、补码、反码相反(0表示负1表示正)
(1)移码的几何性质
移码表示的实质是把真值映像到一个正数域,因此移码的大小可以直观的反应真值的大小。
不管整数还是负数,用移码表示时,可以按无符号数比较大小。
(1) 移码中”0”的表示
移码中”0”的表示是唯一的
[+0]移 = [-0]移 = 2^n+- 0 … 0 = 10…0 (纯整数)
移码的表数范围与补码一致。
纯整数移码表示的最小数可以表示到-2^n
(2) 移码与补码的关系
x>=0 时,[x]补=x,[x]移=2^n+x [x]移 = [x]补 + 2^n
x< 0 时, [x]补 = 2^(n+1) + x , [x]移 = 2^n + x , [x]移 = 2^n + [x]补 – 2^n+1
= [x]补 – 2^n
x = + 1011010
[x]补 = 01011010
[x]移 = 2^n+x = 2^7+1011010 = 11011010
(3) 移码的符号位:
0表示负数,1表示正数,和原码、反码、补码不同。
(4) 移码与真值的线性关系:
移码的顺序和真值完全一致,因此移码在表示阶码时可以方便的进行大小的比较,其结果与真值一致。
答:是32位机器,所以int类型是32位,y为短整形16位,
z = x + y
加减运算一定是补码运算
127 = 01111111 真值
è 0000,0000,0000,0000,0000,0000,0111,1111 = 0000007FH
-9 = 11001
-> 10111 -> 1111,1111,1111,0111 = FFF7H
127+(9)= 118 = 01110110
8位
1个符号位 7个数值位
表示范围是-128~+127
答案选B。
效验码
元件故障\噪声干扰等各种因素常常导致计算机在处理信息过程中出现错误。为了
防止错误,可将信号采用专门的逻辑线路进行编码以检测错误,甚至校正错误。通常的方法是,在每个字上添加一些校验位,用来确定字中出现错误的位置。
- 奇偶校验码
组成奇偶校验码的基本方法:在n位有效信息位上增加一个二进制校验位,构成一个n+1位奇偶校验码。
奇校验:使n+1位的奇偶校验码中的1的个数为奇数。
偶校验:使n+1位的奇偶校验码中的1的个数为偶数。
B.海明校验码
海明校验实质上是一种多重奇偶校验。它将有效信息按某种规律分成若干组,每组安排一个校验位作奇偶测试,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。
2.2.2 定点数的运算
定点加法减法运算
补码加法
负数用补码表示后,可以和正数一样来处理。
当需要减去一个x时可以用加上x对应的负数的补码[-x]补来代替。
这样,运算器里只需要一个加法器就可以了,不必为了负数的加法运算,再配一个减法器。
补码运算的基本规则:
- 运算的各个操作数均补码表示,运算结果仍是补码。
- 符号位与数值位一样参加运算。
- 求和求差直接加
- 补码是对确定的模而言,若运算结果超过了模,则将模自动丢掉。
2.2.23 溢出概念与检测方法
两个正数相加,结果大于机器所能表示的最大正数,称为上溢,而两个负数相加,结果小于机器所能表示的最小负数,称为下溢。
为了判断”溢出”是否发生,可采用两种检测的方法。第一种方法是采用双符号位法。
双符号位法又称变形补码,符号位又两位用”00”表示正,“11“表示负。
*了解
2.2 定点乘法运算
2.2.1 原码一位乘法
1.分析笔算乘法
A=-0.1101 B = 0.1011
0.1101
X 0.1011
_____________
1101
1101
0000
1101
0.10001111
乘积的符号心算求得
符号位单独处理
乘数的某一位决定是否加被乘数
4个积一起相加
乘积的位数扩大一倍
乘法改进
A*B = A* 0.1011 = A*(0.1+0.00+0.001+0.0001)
= 0.1*A + 0.00*A + 0.001*A + 0.0001*A
= 0.1{A+0.1[0*A+0.1*(A+0.1*A)]}
乘->移+加
[乘积] 0
小结
乘法 运算可用 加和移位实现
n = 4, 加4次,移4次
由成熟的末位决定被乘数是否与原部分积相加,然后à1位形成新的部分积,同时乘数->1位(末位移丢), 空出高位存放部分积的低位。
被乘数只与部分积的高位相加
硬件: 3个寄存器,具有移位功能。
1 个全加器
2.4 定点除法运算
2.4.1 原码除法运算原理
机器的运算过程和人不同,人会心算,一看就知道够不够减。
但机器却不会心算,必须先作减法。
若余数位正,才知道够减;若余数位负,才知道不够减。
不够减时必须恢复原来的余数,以便再继续往下运算。这种方法称为恢复余数法。
要回复原来的余数,只要当前的余数
恢复余数法
余数为正 商1
余数为负 商0,恢复余数
由于要恢复余数,使除法进行过程的步数不固定,因此控制比较复杂。
2.浮点数的表示方法
骚操作
2.6.1 浮点加法、减法运算
(3)尾数求和运算
(4)结果规格化
2.5算数逻辑单元ALU
2.5.1多功能算数/逻辑运算单元(ALU)
由一位全加器(FA)构成的行波进位加法器,它可以实现加法运算和减法运算。
但是这种加法/减法器存在两个问题:
一是由于串行进位,它的运算时间很长。
假如加法器由n位全加器构成,每一位的进位延迟时间为20ns,那么最坏情况下,进位信号从最低位传递到最高为而最后输出稳定,至少需要nX20ns这在高速计算中显然是不利的