408计算机组成原理学习:数据的表示与计算

408计算机组成原理学习:数据的表示与计算

定点数:小数点的位置固定 Eg:996.007 ——常规计数
浮点数:小数点的位置不固定 Eg:9.96007*10^2 ——科学计数法

定点数的表示:

  1. 无符号数
  2. 有符号数:
    1、原码
    2、反码
    3、补码
    4、移码

无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
n位的无符号数表示范围为:0 ~ 2^n - 1
无符号数通常只有无符号整数,而没有无符号小数

有符号数的表示
在这里插入图片描述

0正 1负
可用 原码、反码、补码 三种方式来表示定点整数和定点小数。还可用 移码 表示定点整数。

在这里插入图片描述

原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”
若机器字长为n+1位,则尾数占n位
如:机器字长为8位
定点整数
在这里插入图片描述

eg:常写为:
	x= -19D
	[x] 原 =10010011
若未指明机器字长,也可写为:[x] 原 =110011

定点小数
在这里插入图片描述

Eg:常写为:
x= -0.75D
[x] 原 = 1.1100000

若机器字长n+1位,原码整数的表示范围:
−(2^n −1) ≤ x ≤ 2^n −1(关于原点对称)

机器字长n+1位,原码小数的表示范围:
−(1−2^−n ) ≤ x ≤ 1−2^−n (关于原点对称)

真值0有 +0 和 -0 两种形式

反码
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反

补码
正数的补码 = 原码
负数的补码 = 反码末位+1(要考虑进位)

移码
补码的基础上将符号位取反。
注意:移码只能用于表示整数

X 的值	原、反、补、移码	补充说明x= +19D	[x] 原 = 0,0010011	正数[x] 反 = 0,0010011	反码 = 原码[x] 补 = 0,0010011	补码 = 原码[x] 移 = 1,0010011 	移码 = 原码符号位取负x= -19D	[x] 原 = 1,0010011	负整数[x] 反 = 1,1101100	反码:数值位取反[x] 补 = 1,1101101	补码:数值位取反+1[x] 移 = 0,1101101	移码:数值位取反+1,符号位变号x= +0.75D	[x] 原 = 0.1100000 	同整数[x] 反 = 0.1100000	小数没有移码[x] 补 = 0.1100000x= -0.75D	[x] 原 = 1.1100000	同整数[x] 反 = 1.0011111	小数没有移码[x] 补 = 1.0100000

原、反、补、移码的表示范围:
在这里插入图片描述

使用原码运算:
加法——用加法器完成
减法——用减法器完成(正数-正数)
-3 = 9(mod 12)
在时钟中 10-3 = 7,10+9 = 7(19 mod 12 = 7)

带余除法——设 x,m∈Z, m > 0则存在唯一决定的整数q和r , 使得:
x = qm + r , 0 ≤ r < m
(mod 12)将所有整数分为12类(余数为 0~11)

在 (mod m) 的条件下,若能找到负数的补数,就可以用正数的加法来等价替代减法
在mod 12的情况下-3跟9互为补数

即在机器字长为8位的情况下,减去一个数,可以求其 mod 2^8(即其补码),将减法转化为加法

补码的作用:
使用补码可将减法操作转变为等价的加法,ALU 中无需集成减法器。执行加法操作时,符号位一起参与运算

模 - a的绝对值 = a 的补数 = a的补码

移码作用:移码表示的整数很方便对比大小

在这里插入图片描述

移位运算

1.算术移位 : 原码 反码 补码
2.逻辑移位
3.循环移位

移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法

算数移位

原码的算数移位——符号位保持不变,仅对数值位进行移位。
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差

反码的算数移位——正数的反码与原码相同,因此对正数反码的移位运算也和原码相同。
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。

反码的算数移位——负数的反码数值位与原码相反,因此负数反码的移位运算规则如下,
右移:高位补1,低位舍弃。
左移:低位补1,高位舍弃。

补码的算数移位——正数的补码与原码相同,因此对正数补码的移位运算也和原码相同。
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。

补码的算数移位——负数补码 = 反码末位+1 导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。
规律——负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
负数补码的算数移位规则如下:
右移(同反码):高位补1,低位舍弃。
左移(同原码):低位补0,高位舍弃。
在这里插入图片描述

左移相当于×2;右移相当于÷2

逻辑移位

逻辑右移:高位补0,低位舍弃。
逻辑左移:低位补0,高位舍弃。
可以把逻辑移位看作是对“无符号数”的算数移位

循环移位

在这里插入图片描述

在这里插入图片描述

原码的加减运算

原码的加法运算:

正+正 ->绝对值做加法,结果为正, 可能会溢出
负+负 ->绝对值做加法,结果为负, 可能会溢出
正+负 ->绝对值大的减绝对值小的,符号同绝对值大的数
负+正 ->绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算,

“减数”符号取反,转变为加法:
正-负->正+正
负-正->负+负
正-正->正+负
负-负->负+正

[A+B]补 = [A]补 + [B]补
[A-B]补 = [A]补 + [-B]补
[-B]补 : [B]补 连同符号位一起取反加1

溢出判断

只有“正数+正数 ”才会上溢 —— 正+正=负
只有“负数+负数 ”才会下溢 —— 负+负=正
方法一:采用一位符号位
设A的符号为As ,B的符号为Bs ,运算
结果的符号为Ss ,则溢出逻辑表达式
为:
在这里插入图片描述

若V=0,表示无溢出;
若V=1,表示有溢出。

逻辑表达式
与:如ABC,表示A与B与C

或:如A+B+C,表示A或B或C

方法二:采用一位符号位,根据数据位进位情况判断溢出符号位的进位Cs, 最高数值位的进位C1
Cs 与C1 不同时有溢出
在这里插入图片描述

处理“不同”的逻辑符号:异或⊕
溢出逻辑判断表达式为V=Cs ⊕ C1
若V=0,表示无溢出;V=1,表示有溢出。

方法三:采用双符号位
正数符号为00,负数符号为11
记两个符号位为Ss1 Ss2 ,则V=Ss1 ⊕ Ss2
若V=0,表示无溢出;若V=1,表示有溢出。

符号扩展
Int -> long,短数据->长数据。多出来的那些位应该怎么填补

Eg:8位->16位
正整数(原、反、补码的表示都一样)
0,1011010 -> 0,00000000 1011010

正小数(原、反、补码的表示都一样)
0.1011010 -> 0.1011010 00000000

负整数:

原码:1,1011010 -> 1,00000000 1011010
反码:1,0100101 -> 1,11111111 0100101
补码:1,0100110 -> 1,11111111 0100110

负小数:
原码:1.1011010 -> 1.1011010 00000000
反码:1.0100101 -> 1.0100101 11111111
补码:1.0100110 -> 1.0100110 00000000

定点整数的符号扩展:
在原符号位和数值位中间添加新位,正数都添0;负数原码添0,负数反、补码添1

定点小数的符号扩展:
在原符号位和数值位后面添加新位,正数都添0;负数原、补码添0,负数反码添1

在这里插入图片描述

乘法运算

在这里插入图片描述

原码一位乘法

符号单独处理:符号位进行异或⊕运算

ACC: 累加器,用于存放操作数,或运算结果
MQ: 乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
X: 通用的操作数寄存器,用于存放操作数
ALU: 算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算

Eg:
设机器字长为 n+1=5位(含1位符号位)
0.1101 × 0.1011
步骤:
1.将累加器ACC初始化为00000,并用来存放乘积的高位
2.MQ用来存放乘数,X用来存放被乘数
3.拿MQ中乘数的最低位来乘以 X 里面的被乘数,并将结果放到ACC里面相加

当前位=1,则ACC加上被乘数
当前位=0,则ACC加上 0

4.将ACC与MQ并列,然后整体逻辑右移(ACC里的最低位变为MQ里的最高位,MQ最低位舍弃)ACC高位补0
5.步骤3和4重复n次

在这里插入图片描述

ACC以及ACC右移到MQ中的部分为部分积
符号位不参与计算,计算出结果后,将符号位异或的结果直接加上去

手写模拟
在这里插入图片描述

补码一位乘法(Booth算法)

补码一位乘法:
进行 n 轮加法、移位,最后再多来一次加法
实现:
在MQ中添加一位辅助位
在这里插入图片描述

辅助位 -(减) MQ中最低位 = 1时,(ACC)+[x]补
辅助位 - MQ中最低位 = 0时,(ACC)+0
辅助位 - MQ中最低位 = -1时,(ACC)+[-x]补

Eg:
x = −0.1101,y = +0.1011,采用Booth算法求x·y

在这里插入图片描述

注:一般来说,Booth算法的被乘数、部分积采用双符号位补码
在这里插入图片描述

定点数原码除法运算

在这里插入图片描述

x/y结果为0.1101,余数为0.00000111
规律:
忽略小数点,每确定一位商,进行一次减法,得到4位余数,在余数末尾补0,再确定下一位商。确定5位商即可停止(机器字长为5位)

原码除法:恢复余数法

ACC:被除数、余数
MQ:商
X:除数

符号单独处理:符号位 = xs ⊕ ys
数值位取绝对值进行除法计算
Eg:
设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复余数法求x/y
|x|=0.1011,|y|=0.1101,[ |y| ]补 =0.1101,[ −|y| ]补 =1.0011
实现方法:上商0/1,得到余数,余数末尾补0

步骤:
1.ACC里面先存放被除数x, 寄存器X中存放的是除数y,MQ里存放的是商初始为00000
2.计算机会先默认上商1,
MQ为00001,(ACC)-(除数) -> ACC
(ACC)+ [ −|y| ]补 -> ACC
01011+10011 = 11110,相减的结果为负数,说明应该商0,
如果搞错了再改上商0。并“恢复余数”
(ACC)+(除数) -> ACC
(ACC)+ [ |y| ]补 -> ACC
11110+01101 = 01011(恢复余数)
3.ACC与MQ整体逻辑左移,ACC高位丢弃,ACC的低位为MQ的高位,MQ低位补0。

4.重复步骤2和3,即默认先商 1 ,看结果的正负号,负则说明应该商0,且恢复余数,结果为正说明商1正确,直到确定5位商。

注:若最后一步商余数为负,也需要恢复余数并商0

手算结果为:
在这里插入图片描述

原码除法:加减交替法

加减交替法(又名:不恢复余数法):当余数为负时商0,并左移,再+|除数|

设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101
在这里插入图片描述

步骤:
1.直接先让(ACC)+ [ −|y| ]补,看得到的余数结果,
2.若为正,则商1,让余数左移1位再减去|除数|,得到下一个新余数,看结果得商
若余数为负,则可直接商0,让余数左移1位再加上|除数|,得到下一个新余数,看结果得商
重复上述操作2,直到得到5位商
在这里插入图片描述

左移n次,但是加法可能会进行n+2次

补码除法运算

补码除法:加减交替法
补码除法:
• 符号位参与运算
• 被除数/余数、除数采用双符号位

被除数和除数同号,则被除数减去除数;
异号则被除数加上除数。

余数和除数同号,商1,余数左移一位减去除数;
余数和除数异号,商0,余数左移一位加上除数。
重复n次

在这里插入图片描述

末尾的商恒置为1,不考虑余数与除数是否同号还是异号
[x/y] 补 =1.0101,余0.0111×2^−4

在这里插入图片描述

C 语言中定点整数是用“补码”存储的

short型占用2个字节
int型占用4个字节
长整数变短整数:高位截断,保留低位。
Eg: 0x000286a1 -> 0x86a1

短整数变长整数:符号扩展。
Short x = -4321;
x:1110 1111 0001 1111(0xef1f(
x -> m(int m = x)
m:1111 1111 1111 1111 1110 1111 0001 1111(0xffffef1f )

数据的存储和排列

多字节数据在内存里一定是占连续的几个字节
Eg:
4字节 int:01 23 45 67 H
01:最高有效字节(MSB)
67:最低有效字节(LSB)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小二康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值