408计算机组成原理学习:数据的表示与计算
目录
定点数:小数点的位置固定 Eg:996.007 ——常规计数
浮点数:小数点的位置不固定 Eg:9.96007*10^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(要考虑进位)
移码
补码的基础上将符号位取反。
注意:移码只能用于表示整数
原、反、补、移码的表示范围:
使用原码运算:
加法——用加法器完成
减法——用减法器完成(正数-正数)
-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)