一、计算机系统概论
看书看书,都是文字,(想拿高分)多了解
二、数据的表示和运算
各种进制及其转换
各种进制的常见书写方式
二进制优越性
①可使用两个稳定状态的物理器件表示
②0,1 正好对应逻辑值 假、真。方便实现逻辑运算
③可很方便地使用逻辑门电路实现算术运算
任意进制→十进制
采用r 进制计数法每个位数的基数×该进制的位权次幂依次相加就可以啦
r 进制计数法
基数:每个数码位所用到的不同符号的个数,r 进制的基数为 r
举例
大家也可以记住常见的二进制各个位的十进制值(右击保存图片收藏)
二进制↔八进制、十六进制
二进制 —> 八进制
3位一组,毎组转换成对应的八进制符号
八进制—> 二进制
每位八进制对应的3位二进制
二进制 —> 十六进制
4位一组,毎组转换成对应的十六进制符号
二进制 —> 十六进制
4位一组,毎组转换成对应的十六进制符号
十进制→任意进制
除 x 取余倒排法(x 代表进制数)
完整内容可以参考这个回答:
https://zhidao.baidu.com/question/374587905766222524.html
如:75.3 小数部分=0.3
那么我们转化成二进制就是这样
- 整数部分
- - 小数部分
十进制→二进制(拼凑法)
用这个图直接凑
真值和机器数
- 真值:符合人类习惯的数字
- 机器数:数字实际存到机器里的形式,正负号需要被“数字化”
例如下面两个数
定点数与浮点数的举例
无符号数
概念
无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
例如:
表示范围
8位二进制数有 2^8 种不同的状态
n位的无符号数表示范围为:0 ~ 2^n -1
有符号数
有符号数的表示
例如
但是这样小数点的位置会不固定,所以就有了有符号数的定点表示的规定
有符号数的定点表示
定点整数
定点小数
注意:
- 可用 原码、反码、补码 三种方式来表示定点整数和定点小数。
- 还可用 移码 表示定点整数。
- 若真值为 x,则用 [x]原、[x]反、[x]补、[x]移 分别表示真值所对应的原码、反码、补码、移码
原码、反码、补码、移码
原码
反码
- 若符号位为0,则反码与原码相同
- 若符号位为1,则数值位全部取反
补码
- 正数的补码 = 原码
- 负数的补码 = 反码末位+1(要考虑进位)
- 将负数补码转回原码的方法相同:尾数取反,末位+1
移码
- 移码: 补码的基础上将符号位取反。
注意:移码只能用于表示整数
用几种码表示定点整数
各种码的真值0
各种码转换图
各种码表示范围
算数移位运算
移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法
原码的算数移位
例如原码为 10101000 进行算数移位
原码的算数移位——符号位保持不变,仅对数值位进行移位。
- 右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
- 左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差
反码的算数移位
反码的算数移位——正数的反码与原码相同,因此对正数反码的移位运算也和原码相同。
- 右移:高位补0,低位舍弃。
- 左移:低位补0,高位舍弃
反码的算数移位——负数的反码数值位与原码相反,因此负数反码的移位运算规则如下,
- 右移:高位补1,低位舍弃。
- 左移:低位补1,高位舍弃。
补码的算数移位
补码的算数移位——正数的补码与原码相同,因此对正数补码的移位运算也和原码相同。
- 右移:高位补0,低位舍弃。
- 左移:低位补0,高位舍弃。
补码的算数移位——负数补码=反码末位+1 导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。
规律——负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
负数补码的算数移位规则如下:
- 右移(同反码):高位补1,低位舍弃。
- 左移(同原码):低位补0,高位舍弃。
逻辑移位
- 逻辑右移:高位补0,低位舍弃。
- 逻辑左移:低位补0,高位舍弃。
可以把逻辑移位看作是对“无符号数”的算数移位
逻辑移位的应用举例
例如颜色RGB分别存储的数据为:
R = 102 01100110
G = 139 10001011
B = 139 10001011
需要将三个灰度值合成一个才能成彩色图像
循环移位
原码的加减运算
原码的加法运算:
- 正+正 → 绝对值做加法,结果为正 (可能会溢出)
- 负+负 → 绝对值做加法,结果为负 (可能会溢出)
- 正+负 → 绝对值大的减绝对值小的,符号同绝对值大的数
- 负+正 → 绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算,“减数”符号取反,转变为加法:
- 正-负 → 正+正
- 负-正 → 负+负
- 正-正 → 正+负
- 负+正 → 负-
补码的加减运算
对于补码来说,无论加法还是减法,最后都会转变成加法,由加法器实现运算,符号位也参与运算。
补充:
1. 求[-B]补
[-B]补 : [B]补连同符号位一起取反加1
2. 负数补 → 原:
①数值位取反+1;
②负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
例题
我们先看一道例题:设机器字长为8位(含1位符号位),A = 15,B = -24,求[A+B]补和[A−B]补
先将A B的原码补码都求出来
[A+B]补 = [A]补 + [B]补 = 0,0001111 + 1,1101000 = 1,1110111
原码:1,0001001 真值-9
[A-B]补 = [A]补 + [-B]补 = 0,0001111 + 0,0011000 = 0,0100111
真值+39
我们将题改一下:
其中 C = 124,求[A+C]补和[B−C]补,按照上面方法求出可得:
[A+C]补 = 0,0001111 + 0,1111100 = 1,0001011 真值-117 溢出(实际应该是139,但是溢出后是 -117)
[B−C]补 = 1,1101000 + 1,0000100 =0,1101100 真值+108
溢出判断
溢出条件
- 只有“正数+正数 ”才会上溢 —— 正+正=负
- 只有“负数+负数 ”才会下溢 —— 负+负=正
溢出判断:采用双符号位
正数符号为00,负数符号为11
[A+C]补 = 00,0001111 + 00,1111100 = 01,0001011 上溢
[B−C]补 = 11,1101000 + 11,0000100 = 10,1101100 下溢
记两个符号位为S1 S2 ,则V=S1异或S2
- 若V=0,表示无溢出;
- 若V=1,表示有溢出。
乘法运算的思想
手算乘法(二进制)
例如: 算 0.1101×0.1011
列竖式
移位运算
原码的一位乘法
补充:运算器相关知识
运算器:用于实现算术运算(如:加减乘除)、逻辑运算(如:与或非)
- ACC: 累加器,用于存放操作数,或运算结果。
- MQ: 乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
- X: 通用的操作数寄存器,用于存放操作数
- ALU: 算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算
原码一位乘法实现方法:先加法再移位,重复n次
符号位通过异或确定;数值部分通过被乘数和乘数绝对值的 n 轮加法、移位完成根据当前乘数中参与运算的位确定(ACC)加什么。
- 若当前运算位 =1,则(ACC)+[|x|]原;
- 若当前运算位 =0,则(ACC)+0。
每轮加法后ACC、MQ的内容统一逻辑右移
手算模拟
tips
- 乘数的符号位不参与运算,可以省略
- 原码一位乘可以只用单符号位
- 答题时最终结果最好写为原码机器数
例题
设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用原码一位乘法求x·y
解:手动计算是这样
符号位:1与0进行异或运算,得0。
所以随后结果是:x·y= -0.10001111
补码的一位乘法(Booth算法)
- 进行 n 轮加法、移位,最后再多来一次加法
- 每次加法可能 +0 、+[x]补、+[-x]补
- 每次移位是“补码的算数右移”
- 符号位参与运算
在第二个步骤中,需要根据MQ中的最低位、辅助位 来确定加什么:
- 辅助位 - MQ中最低位 = 1时,(ACC)+[x]补
- 辅助位 - MQ中最低位 = 0时,(ACC)+0
- 辅助位 - MQ中最低位 = -1时,(ACC)+[-x]补
手算模拟
例题
设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用Booth算法求x·y
解:手动计算是这样
最后得 [x·y]补 = 11.01110001
即x·y = −0.10001111
做题总结
- n轮加法、算数右移,加法规则如下:
辅助位 - MQ中最低位 = 1时,(ACC)+[x]补
辅助位 - MQ中最低位 = 0时,(ACC)+0
辅助位 - MQ中最低位 = -1时,(ACC)+[-x]补
- 补码的算数右移:
符号位不动,数值位右移,正数右移补0,
负数右移补1(符号位是啥就补啥)
- 一般来说,Booth算法的被乘数、部分积采用双符号位补码
原码,补码一位乘法的对比
原码除法:恢复余数法(了解,不考)
思路图(打字打不清楚了是)
补充知识:大小端模式与边界对其
大小端模式
大家一定知道:多字节数据在内存里一定是占连续的几个字节
最高有效字节我们用MSB表示
最低有效字节我们用LSB表示
例如
- 大端模式更便于人类阅读
- 小端模式更便于便于机器处理
边界对齐
现代计算机通常是按字节编址,即每个字节对应1个地址
通常也支持按字、按半字、按字节寻址。
假设存储字长为32位,则1个字=32bit,半字=16bit。
每次访存只能读/写1个字
- 下面是边界对其方式:不够四字节的会填充空的
下面是不对齐方式,不够四字节的不填充
浮点数的表示
定点数:如纯小数0.1011和纯整数11110
浮点数表示形式
阶码:常用补码或移码表示的定点整数
尾数:常用原码或补码表示的定点小数
浮点数的真值:
阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度。
举个栗子
例题:阶码、尾数均用补码表示,求a、b的真值
a = 0,01;1.1001
b = 0,10;0.01001
解:
a: 阶码0,01对应真值+1
尾数1.1001对应真值-0.0111
a的真值 = 21×(−0.0111) = −0.111
(相当于尾数表示的定点小数算数左移一位,或小数点右移一位)
b: 阶码0,10对应真值+2
尾数0.01001对应真值+0.01001
b的真值 = 22×(+0.01001) = +1.001
(相当于尾数表示的定点小数算数左移2位,或小数点右移2位)
浮点数尾数的规格化
规格化浮点数:规定尾数的最高数值位必须是一个有效值 。
左归与右归
- 左规:当浮点数运算的结果为非规格化时要进行规格化处理, 将尾数算数左移一位,阶码减1。
- 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时, 将尾数算数右移一位,阶码加1
说白了就是:
- 左归就是通过算数左移、阶码减1 来规格化
- 右归就是通过算数右移、阶码加1 来规格化
例题:浮点数加法
例:a = 010;00.1100,b = 010;00.1000,求a+b
解:a = 22×00.1100 ,b = 22×00.1000
a+b
= 22×00.1100 + 22×00.1000
= 22×(00.1100 + 00.1000)
= 22×01.0100
= 23×00.1010
(注:采用“双符号位” ,当溢出发生时,可以挽救。更高的符号位是正确的符号位)
规格化浮点数的特点
1. 用原码表示的尾数进行规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
尾数的表示范围为1/2≤M≤(1−2−n)。
- 负数为1.1××…×的形式,其最大值表示为1.10…0;最小值表示为1.11…1。
尾数的表示范围为−(1−2−n)≤M≤−1/2。
2. 用补码表示的尾数进行规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
尾数的表示范围为1/2≤M≤(1−2−n)。
- 负数为1.0××…×的形式,其最大值表示为1.01…1;最小值表示为1.00…0。
尾数的表示范围为−1≤M≤−(1/2+2−n)
3. 表示范围
4. 注意事项(※)
1. 规格化的原码尾数,最高数值位一定是1
2. 规格化的补码尾数,符号位与最高数值位一定相反
3. 补码算数左移,低位补0;补码算数右移,高位补1
浮点数的加减运算
我们可以先通过十进制的浮点数加减运算步骤来类推二进制的
十进制浮点数加减运算步骤:
浮点数加减运算包括五个步骤:① 对阶② 尾数加减③ 规格化④ 舍入⑤ 判溢出
例如:计算9.85211 × 1012 + 9.96007 × 1010
解: