计算机组成原理-编码
文章目录
无符号数
所有的值都是数值
有符号数
符号位 数值位
以8位机器字长举例 首位为符号位 0/1 对应 正/负
0 000 0001 +1
1 000 0001 -1
定点数
小数位是固定在某个位置的
符号位 数值位 小数点位置 小数位
原码
符号位 数值位
【x】原 0000 0001
【x】原 1000 0001
反码
【x】原 符号位不变,如果符号位是负,数值位取反------>【x】反
【x】原 0000 0001 ------>【x】反 0000 0001
【x】原 1000 0001 ------>【x】反 1111 1110
补码
【x】反 符号位不变,如果符号位是负,数值位+1------>【x】补
【x】反 0000 0001------>【x】补 0000 0001
【x】反 1111 1110------>【x】补 1111 1111
移码
【x】补 符号位取反------>【x】移
【x】补 0000 0001 ------>【x】移 1000 0001
【x】补 1111 1111 ------>【x】移 0111 1111
原码,反码,补码,移码 之间的关系
机器字长 n+1
原码范围 - 2n +1 <= x <= 2n -1 ( +0 , -0 )
反码范围 - 2n +1 <= x <= 2n -1 ( +0 , -0 )
补码范围 - 2n <= x <= 2n -1 ( 0 , 并且多了一个最小负数 )
移码范围 - 2n <= x <= 2n -1 ( 0 , 并且多了一个最小负数 )
浮点数
小数位是浮动的
编码运算
编码加减运算和溢出判断
编码加减运算情况运算
加数 | 被加数 | 和 | 溢出 |
---|---|---|---|
正数 | 正数 | 正数 | 可能溢出 |
正数 | 负数 | 正数/负数 | |
负数 | 正数 | 正数/负数 | |
负数 | 负数 | 负数 | 可能溢出 |
减数 | 被减数 | 差 | 溢出 |
---|---|---|---|
正数 | 正数 | 正数/负数 | |
正数 | 负数 | 负数 | 可能溢出 |
负数 | 正数 | 正数 | 可能溢出 |
负数 | 负数 | 正数/负数 |
编码如何进行加减运算
编码的加减运算其实就是把原码转成补码,补码的符号位也参与运算
加法 [和]补 = [被加数]补 + [加数]补
正数+正数(没有溢出的情况)
8位二进制带有符号位的原码 A = 25 B = 16 C = A+B
A = 0 001 1001
B = 0 001 0000
[C]补 = [A]补 + [B]补 = 0 001 1001 + 0 001 0000 = 0 010 1001
正数的情况下 补码和原码相同 [C]原 = [C]补 = 0 010 1001
正数+负数
8位二进制带有符号位的原码 A = 25 B = -16 C = A+B
A = 0 001 1001
B = 1 001 0000
[C]补 = [A]补 + [B]补 = 0 001 1001 + 1 111 0000 = 0000 1001
正数的情况下 补码和原码相同 [C]原 = [C]补
负数+正数
8位二进制带有符号位的原码 A = -25 B = 16 C = A+B
A = 1 001 1001
B = 0 001 0000
[C]补 = [A]补 + [B]补 = 1 110 0111 + 0 001 0000 = 1 111 0111
[C]补 转 [C]反 转[C]原 = 1 000 1001
负数+负数(没有溢出的情况)
8位二进制带有符号位的原码 A = -25 B = -16 C = A+B
A = 1 001 1001
B = 1 001 0000
[C]补 = [A]补 + [B]补 = 1 110 0111 + 1 111 0000 = 1 101 0111
[C]补 转 [C]反 转[C]原 = 1 010 1001
减法 [差]补 = [被减数]补 + [-减数]补
其中[-减数]补 就是[减速符号位取反]补
正数-正数
8位二进制带有符号位的原码 A = 25 B = 16 C = A-B
A = 0 001 1001
B = 0 001 0000
[A]补 = 0 001 1001
[-B]补是 0 001 0000 符号位取反 变成 1 001 0000 , 1 001 0000 转补码 1 110 1111
[C]补 = [A]补 + [-B]补 = 0 001 1001 + 1 110 1111 = 0 000 1000
正数的情况下 补码和原码相同 [C]原 = [C]补 = 0 000 1000
正数-负数(没有溢出的情况)
8位二进制带有符号位的原码 A = 25 B = -16 C = A-B
A = 0 001 1001
B = 1 001 0000
[A]补 = 0 001 1001
[-B]补是 1 001 0000 符号位取反 变成 0 001 0000 , 0 001 0000 转补码0 001 0000
[C]补 = [A]补 + [-B]补 = 0 001 1001 + 0 001 0000 = 0 010 1001
正数的情况下 补码和原码相同 [C]原 = [C]补 = 0 010 1001
负数-负数
8位二进制带有符号位的原码 A = -25 B = -16 C = A-B
A = 1 001 1001
B = 1 001 0000
[A]补 = 1 110 0111
[-B]补是 1 001 0000 符号位取反 变成 0 001 0000 , 0 001 0000 转补码0 001 0000
[C]补 = [A]补 + [-B]补 = 1 110 0111 + 0 001 0000 = 1 111 0111
[C]补 转 [C]反 转[C]原 = 1 000 1001
负数-正数(没有溢出的情况)
8位二进制带有符号位的原码 A = -25 B = 16 C = A-B
A = 1 001 1001
B = 0 001 0000
[A]补 = 1 110 0111
[-B]补是 0 001 0000 符号位取反 变成 1 001 0000 , 0 001 0000 转补码 1 111 0000
[C]补 = [A]补 + [-B]补 = 1 110 0111 + 1 111 0000 = 11 01 0111
[C]补 转 [C]反 转[C]原 = 1 000 1001
编码加减运算溢出
首先要了解减法是转变成加法进行运算的
然后加法溢出是加数和被加数的符号位相同的情况下,相加才可能发生溢出
加法 正+正可能溢出,负加负 可能溢出
减法 会转变成 [A]补 + [-B]补 ,正-负,负-正 转成加法 正+正 , 负+负也符合加法溢出的情况
加数 | 被加数 | 和 | 溢出 |
---|---|---|---|
正数 | 正数 | 正数 | 可能溢出 |
负数 | 负数 | 负数 | 可能溢出 |
减数 | 被减数 | 差 | 溢出 |
---|---|---|---|
正数 | 负数 | 负数 | 可能溢出 |
负数 | 正数 | 正数 | 可能溢出 |
8位机器字长的二进制数(有一位符号位)
A = 25 = 0 001 1001
B = -25=1 001 1001
C =125= 0 111 1101
D =-125= 1 111 1101
A+C 的结果出现溢出
A-C 的结果无溢出
B+C的结果无溢出
B-C的结果有溢出
计算机内部如何判断溢出的?
一位符号位
V = ASBSSS’ + AS’BS’Ss
V = 0无溢出 , V = 1有溢出
AS 是被加数的符号位
BS 是加数的符号位
Ss 是结果的符号位
当加数和被加数的符号位不一致,肯定不能发生溢出
当加数和被加数的符号位一致时,可能发生溢出,结果的符号位如果和加数,被加数的符号位不一致就是发生了溢出
假设
8位机器字长的二进制数(有一位符号位)
A = 25 = 0 001 1001
B = -25=1 001 1001
C =125= 0 111 1101
D =-125= 1 111 1101
加法
S = A+C
[S]补 = [A]补 + [C]补 = 0 001 1001 + 0 111 1101 = 1 001 0110 , [S]原 = 1 110 1010 , 十进制 -106 + 256 = 150
两个正数相加得到了负数,这个时候就是发生了溢出
V = ASBSSS’ + AS’BS’Ss = ( 0 与 0 与 0 )或 ( 1 与 1 与 1) = 1 发生了溢出
S = B+D
[S]补 = [B]补 + [D]补 = 1 110 0111 + 1 000 0011 = 0 110 1010 , [S]原 = 0 110 1010 , 十进制 106 - 256 = -150
V = ASBSSS’ + AS’BS’Ss = ( 1 与 1 与 1 )或 ( 0 与 0 与 1) = 1 发生了溢出
减法
S = A-D
[S]补 = [A]补 + [-D]补 = 0 001 1001 + 0 111 1101 = 1 001 0110 , [S]原 = 1 110 1010 , 十进制 -106 + 256 = 150
V = ASBSSS’ + AS’BS’Ss = ( 0 与 0 与 0 )或 ( 1 与 1 与 1) = 1 发生了溢出
S = D-A
[S]补 = [D]补 + [-A]补 = 1 000 0011 + 1 110 0111 = 0 110 1010 , [S]原 = 0 110 1010 , 十进制 106 - 256 = -150
V = ASBSSS’ + AS’BS’Ss = ( 1 与 1 与 1 )或 ( 0 与 0 与 1) = 1 发生了溢出
进位位法
通过用进位来判断 ,如图
双符号位(常用)
双个符号位,实际只存储一个符号位,运算时会复制一个符号位
解释:实际上就是一个符号,但是运算时负复制一个符合位出来,两个符号位是相同的。当被加数,加数运算时,符号位也参与运算,结果的符号位也是两个S1和S2,当S1和S2相同时,没有溢出,S1和S2不同时发生了溢出一般用异或S1⊕S~2表示
假设
8位机器字长的二进制数(有一位符号位)
A = 25 = 0 001 1001
B = -25=1 001 1001
C =125= 0 111 1101
D =-125= 1 111 1101
加法
S = A+C
[S]补 = [A]补 + [C]补 = 0复制0 001 1001 + 0复制0 111 1101 = 01 001 0110
得到的数是 01 110 1010 ,符号位S1和S2分别是 0和1 发生溢出的时候两个符号位是不同的 S1⊕S2
S = B+C
[S]补 = [B]补 + [C]补 = 1复制1 110 0111 + 0复制0 111 1101 = 00 110 0100
得到的数是 00 110 0100 ,符号位S1和S2分别是 0和0 没有发生溢出
减法
S = A-D
[S]补 = [A]补 + [-D]补 = 0复制0 001 1001 + 0复制0 111 1101 = 01 001 0110
得到的数是 01 110 1010 ,符号位S1和S2分别是 0和1 发生溢出的时候两个符号位是不同的 S1⊕S2
S = B-D
[S]补 = [B]补 + [-D]补 =1复制1 110 0111 + 0复制0 111 1101 = 00 110 0100
得到的数是 00 110 0100 ,符号位S1和S2分别是 0和0 没有发生溢出
都是转变成补码后 进行的符号位复制
实际只存储一个符号位,运算时会复制一个符号位
移位运算
算数移位
通过改变各个数码位和小数点的相对位置,从而改变各个数码位的位权
十进制123.456 更改小数点的位置12.3456
原先的1是100,现在的1是10
原先的2是20,现在的1是2
原先的3是3,现在的3是0.3,更改小数点,数码位的位权 表示的数发生改变 十进制就是更改101
可以用于乘除
位数有限不能精准乘除运算
十进制:6*7
二进制 :0 000 0110 * 0 000 0111
首先 0111是 20 + 21 + 22 + 0
然后 0 000 0110 * ( 20 + 21 + 22 + 0) = 0 0110 + 0 0110左移一位 + 0 0110左移两位
结果 0 000 0110 + 0 000 1100 + 0 001 1000 = 0 010 1010 = 十进制 42
原码算数移位
符号位不变,数值位进行移位
机器字长8位原码 [A]原 1 110 0010
机器字长8位原码 [B]原 1 110 0001
正数
[A]原左移一位 由 1 110 0010 变成 1 100 0100 左移低位补0, 但高位舍弃是1的话,1被移出,造成严重误差=
[A]原右移一位 由 1 110 0010 变成 1 011 0001 右移高位补0, 但低位舍弃是1的话,1被移出,造成丢失精度
负数
[B]原左移一位 由 1 110 0001 变成 1 100 0010 左移低位补0 , 但高位舍弃是1的话,1被移出,造成严重误差
[B]原右移一位 由 1 110 0001 变成 1 011 0000 右移高位补0 , 但低位舍弃是1的话,1被移出,造成丢失精度
反码算数移位
原码是正数 ,反码左移低位补0,反码右移高位补0 ,和原码的一样
==原码是负数 ,反码左移低位补1,反码右移高位补1 ==
机器字长8位原码 [A]原 0 110 0010
机器字长8位原码 [B]原 1 110 0010
正数
[A]原 0 110 0010,[A]反 = 0 110 0010
[A]原 左移一位 由 0 110 0010 变成 0100 0100 , [A]左移1位反 = 0 100 0100 左移低位补0,高位舍掉
[A]原 右移一位 由 0 110 0010 变成 0 011 0001, [A]右移1位反 = 0 100 0100 右移高位补0,低位舍弃
负数
[B]原 1 110 0010,[B]反 = 1 001 1101
[B]原 左移一位 由 1 110 0010 变成 1 100 0100 , [B]左移1位反 = 1 011 1011 左移低位补1,高位舍掉
[B]原 右移一位 由1 110 0010 变成 0 011 0001 , [B]右移1位反 = 1 100 1110 右移高位补1,低位舍弃
补码算数移位
原码是正数 ,补码和反码左移低位补0,补码和反码右移高位补0 ,和原码的一样
原码是负数 ,左移是向左移一位,低位补0 。右边最后一个1为分割,右边添加0和原码一样 低位补0
原码是负数 ,右移是向右移一位,高位补1 。右边最后一个1为分割,左边添加0和原码一样 但是转到反码 高位补的1
机器字长8位原码 A 0 110 0010
机器字长8位原码 B 1 110 0010
正数
[A]原 0 110 0010,[A]反 = 0 1100 0100,[A]补 = 0 1100 0100
[A]左移1位原 =0100 0100
[A]左移1位反 = 0 100 0100
[A]左移1位补 = 0 100 0100 左移低位补0,高位舍掉
[A]原 0 011 0001,[A]反 = 0 011 0001,[A]补 = 0 011 0001
[A]右移1位原 =0 011 0001
[A]右移1位反 = 0 011 0001
[A]右移1位补 = 0 011 0001 右移高位补0,低位舍掉
负数
[B]原1 110 0010,[B]反 1 001 1101,[B]补 = 1 001 1110 补码就是右边最后一个1为分割,右边和原码一样,左边取反
[B]左移1位原 =1 100 0100
[B]左移1位反 =1 011 1011
[B]左移1位补 =1 011 1100 左移是向左移一位,低位补0 。右边最后一个1为分割,右边添加0和原码一样 低位补0
[B]右移1位原 =1 011 0001
[B]右移1位反 =1 100 1110
[B]右移1位补 =1 100 1111 右移是向右移一位,高位补1 。右边最后一个1为分割,左边添加0和原码一样 但是转到反码就是补的1
逻辑移位
无符号数的算数移位
左移,低位补0,高位移除:0000 1111 左移4位 1111 0000
右移,高位补0,低位移除:0000 1111 右移4位 0000 0000
循环移位
没有移除
左移,最高位填补到最低位
右移,最低位填补到最高位
进位位循环移位