计算机组成原理-编码-编码加减乘除运算

计算机组成原理-编码


无符号数

所有的值都是数值

有符号数

符号位 数值位

以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

循环移位

没有移除
左移,最高位填补到最低位
右移,最低位填补到最高位
在这里插入图片描述
进位位循环移位
在这里插入图片描述

编码的乘法

原码一位乘法

在这里插入图片描述

补码一位乘

在这里插入图片描述

编码的除法

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值