26考研 | 王道 | 计算机组成原理 | 二、数据的表示和运算
26考研 | 王道 | 计算机组成原理 | 二、数据的表示和运算
文章目录
- 26考研 | 王道 | 计算机组成原理 | 二、数据的表示和运算
- 1 数制与编码
- 1.1 进位计数制
- 1.2 定点数的编码表示
- 1.3 各种码的作用
- 1.4 C语言中的整数类型以及强制转换
- 1.5 零扩展&符号扩展
- 2.2 运算方法和运算电路
- 2.0 数字电路基础
- 2.0.1 逻辑门电路
- 2.0.2 多路选择器、三态门
- 2.1 加法器
- 1. 串行进位的加法器
- 2.并行进位加法器(非重点)
- 3.带标志位的加法器
- 2.2 算术逻辑单元ALU
- 2.3 定点数的移位运算
- 2.4 定点数的加减运算
- 2.5 无符号数的加减运算
- 2.6 补码加减运算电路
- 2.7 无符号整数的乘法运算原理
- 2.8 带符号整数的乘法运算原理
- 2.9 计算机实现乘法运算的三种方式
- 2.10 无符号整数的除法运算原理
- 2.3 浮点数的表示与运算
- 2.3.1 浮点数的表示
- 1.从科学计数法理解浮点数
- 2.float单精度和double双精度浮点型的存储
- 3.IEEE 754浮点数的表示(例题训练)
- 4.IEEE 754浮点数 表示范围&几种特殊状态
- 上溢
- 下溢
- 2.3.3 浮点数的运算
- 2.3.4 数据的大小端和对齐存储
- 重点:
1 数制与编码
1.1 进位计数制
任意进制转换成十进制
二进制<=>八进制、十六进制
各种进制的常见书写方式
十进制转换成任意进制
整数部分
使用短除法得到
小数部分
乘到小数部分为0就停止,不为0就一直乘,如果发现循环,说明没办法正好表示这个数字
到K-5的时候又变回了0.6,说明二进制没办法正好表示0.3
真值和机器数
1.2 定点数的编码表示
无符号数的表示
主存地址是无符号数,不是补码原码之类的,因为主存地址没有负数,所以不需要有符号数来表示
C语言中的无符号整数:
unsigned short a=1; //无符号整数 (短整型 2B)
unsigned int b=2; //无符号整数 (整型 4B)
//而用unsigned定义 float之类的浮点数会报错的
有符号数的定点表示
原码

原码整数表示范围减去1就是因为正0和负0是一个数但是却又两种表示方式
反码
正数的反码和原码相同
负数的反码就是符号位不变,其余位取反
正0和负0的反码不是一个值
补码
正0和负0是一个表示方式,那么表示方式就会比原码多一个,所以补码整数和补码小数的表示范围也会比原码多一个表示方式,就是多出来的-2n和-1
移码
x移是一个无符号数,要求真值x,就是把移码的无符号数值减去偏置,结果是正的就是正的,是负的就是负的,可以去看课后题 24题
常用
1.3 各种码的作用
**补码:**用加法运算代替减法运算而结果仍是正确的结果
这是因为机器字长如果是8bit的话,那么天然就会对28=256进行取余操作,因为只会保留低位,所以用补码,也就是补数进行加法
这样可以只设计加法电路而不设计减法电路,降低成本
移码:
移码和真值的增大方向是一致的,所以会用来比较真值的大小。即移码大小就是真值大小,即看谁的移码中先出现1谁就大。符号位也要参与比较
1.4 C语言中的整数类型以及强制转换
1.无符号数和有符号数的转变就是把符号位当成数值位来计算真值
2.长整数变短整数就是高位截断,然后看你新的类型是有符号数还是无符号数,有符号数就把最高位当做符号位
3.短整数变长整数
如果是负数的话,存储是补码形式,那就要在符号位于最高位之间加1,补足长整数的位数
如果是无符号数的话,就是高位补0
1.5 零扩展&符号扩展
2.2 运算方法和运算电路
2.0 数字电路基础
2.0.1 逻辑门电路
2.0.2 多路选择器、三态门
高阻态既不是低电平的0,也不是高电平的1
2.1 加法器
1. 串行进位的加法器
左边获得Si,右边获得Ci,两者合并得到最后的完整电路,即下图所示
串行进位的加法器的不足之处
2.并行进位加法器(非重点)
不需要知道内部构造,只需要知道加法器的逻辑功能即可
3.带标志位的加法器
2.2 算术逻辑单元ALU
ALU的功能
直送的意思是 数据进来的是什么出去的就是什么,不对数据进行任何处理
2.3 定点数的移位运算
如果算数移位前的最高位和算数移位后的最高位不同(异或为1),说明发生了溢出。其实就是乘了2以后,正的变负的,负的变正的了,那肯定是溢出了
逻辑移位
算数移位:
注:定点小数算数移位同理。
反码的算术移位
补码的算术移位
总结
逻辑移位(无符号数算术移位)
循环移位
2.4 定点数的加减运算
方法三的结果中的双符号位,第一位是本来应该的结果是正的还是负的,第二位是实际结果是正的还是负的
比如 01,那就是本来应该是正的结果是负的,那就是上溢了
两个正数相加产生的溢出是01,两个负数相加的溢出是10
2.5 无符号数的加减运算
2.6 补码加减运算电路
2.7 无符号整数的乘法运算原理
Cn为乘数的位数,在上图就是32
2.8 带符号整数的乘法运算原理
只需要知道工作流程, 不要深究为什么,只要知道怎么做就行了
右移过后空出来的这个最高位要填补的数和原来的乘积寄存器里面的最高位也就是符号位相同
无符号整数的加减法用CF
无符号整数的乘法有没有溢出用的是OF(程序员常用OF来判断),当然如果溢出的话,这个时候CF也会被置为1
2.9 计算机实现乘法运算的三种方式
除非是全0,否则一定需要n个时钟来完成乘法
这个改进方案的思路很常见,我们只需要知道有这么个东西就行,具体怎么改怎么运行的不需要了解
用软件进行逻辑上的等效会比硬件慢得多
2.10 无符号整数的除法运算原理
视频中的例子是恢复余数法,对应的还有不恢复余数法,可以先等把简单的学完了再去了解不恢复余数法和恢复余数法。
恢复余数法是指,每次要判断R-Y的值大于0还是小于0,但其实会把R-Y的值存在R中,如果说我们上了商1,那说明R中就该放R-Y的值,那就不需要去恢复到原来R的值,如果我们上了商0,那说明R不够减,不应该把R-Y放到R中,那就要回复R的值,具体就是控制逻辑计数器发出加法信号,再把Y加一遍给加回去
2.3 浮点数的表示与运算
2.3.1 浮点数的表示
定点数的局限性:定点数可表示的数字范围有限,但我们不能无限制的增加数据的长度。
1.从科学计数法理解浮点数
浮点数的表示
2.float单精度和double双精度浮点型的存储
偏置记忆:偏置为2n-1-1,n为阶码位数
3.IEEE 754浮点数的表示(例题训练)
4.IEEE 754浮点数 表示范围&几种特殊状态
上溢
下溢
1.下溢到0才是下溢异常,下溢到非规格化浮点数并不是异常
2.非规格化正数的最大值就是正下溢和规格化浮点数的边界,就是2-126-2-149
最小值就是负下溢和规格化浮点数的边界,就是-(2-126-2-149),就是加了个负号
double的在末尾
2.3.3 浮点数的运算
浮点数的加减运算
X=-0.101×2^(-101)
-0.101: 补码:1.011 双符号位补码:11.011 扩展:11.011000000
2^(-101): 补码:1011 双符号位补码:11011
浮点数的加减运算-舍入
强制类型转换
2.3.4 数据的大小端和对齐存储
大端就是高位存在低地址,低位存在高地址(最高有效字节存在最低的地址)
小端就是高位存在高地址,低位存在低地址(最高有效字节存在最高的地址)
重点:
1.通常用来表示主存地址的是无符号数
对于CF的理解:加法器不管你送进来的x和y是有符号还是无符号,算CF等于0还是1的时候,x,y都当成无符号数,加法就看溢不溢出,减法就看够不够减
无符号整数加减是否溢出看CF,无符号整数乘除是否溢出看OF
3.减法直接看够不够减也可以
4.
5.存储模4补码仅需一个符号位,因为任何一个正确的数值,模4补码的两个符号位总是相同的
6.注意课后题21,对于减法来说,加法电路是(假设是x-y)先把y给取反然后送入加法器,取反之后的+1操作是留给 sub位来进行的,会给sub位传个1
- 补码表示的规格化尾数形式,它的最高位和符号位一定是相反的,正数是01xxx,负数是10xxx
P65页第23题:补码规格化的表示是小数点后一位与符号位不同
1.110001这种形式的话,小数点前面是符号位,后面才是尾数
注:这里提到的规格化和IEEE754规格化不同
8.基数不为2而是2的倍数时:
尾数的最高n位不全为0:基数为8,那么尾数最高三位不能为0
可以看看:理解原码规格化浮点数中,当基数为4时为何要求尾数最高两位不能全为0,关键在于明白基数(r)如何影响规格化的定义和数值的精度。
为了更直观地理解不同基数下的规格化要求,可以参考下表:
基数 ® | 基数形式 | 规格化要求 (原码表示) | 规格化操作 (每移动一次) | 规格化尾数绝对值范围 |
---|---|---|---|---|
2 | 21 | 最高位为1 | 尾数移1位,阶码±1 | [21,1) |
4 | 22 | 最高两位不全为0 | 尾数移2位,阶码±1 | [41,1) |
8 | 23 | 最高三位不全为0 | 尾数移3位,阶码±1 | [81,1) |
核心原因:保证精度和唯一性
规格化的核心目的是为了确保尾数的有效数字部分占据最高位,从而在给定的位数下获得最高的表示精度。基数 r=4=22意味着阶码每变化1,实际数值相当于乘以或除以4(即移动2个二进制位)
因此,为了确保尾数数值部分的最高有效位得到充分利用,规格化要求最高两位不能同时为0。如果最高两位全为0,例如 0.001101...
,其数值绝对值小于 1/4,可以通过左移两位(尾数乘以4)同时阶码减1的方式来将其转换为更高精度的表示形式 0.110100...
权衡:范围与精度
提高基数(如从2提升到4)可以扩大浮点数的表示范围,因为阶码的每一次变化都会带来更大的数值跳跃。然而,这也会导致相邻可表示数值之间的间隔(精度)变大。为了保证在较大基数下仍能维持一定的精度,就必须确保尾数本身足够“大”,即其有效数字从高位开始。要求最高两位不全为0,正是为了在范围和精度之间取得一个平衡。
总结
总而言之,对于基数为4的原码规格化浮点数,规定尾数最高两位不能全为0,是为了:
- 确保精度:充分利用尾数的每一位,保证数值表示的精确度。
- 保持表示的唯一性:避免同一个数值有多种不同的表示形式。
- 平衡范围与精度:在扩大数值表示范围的同时,通过规格化约束来维持必要的精度。
9.长度相同但前者阶码长,尾数短,后者阶码短,尾数长。那么前者可以表示的数的范围大,但精度低
长度,阶码,尾数都相同,前者基数大,后者基数小,那么前者可以表示的数的范围大,但精度低
10.与非规格化浮点数相比,采用规格化浮点数的目的主要是为了增加数据表示的精度(假设有一个数是0.000000000000000001,与其花很多bit存储0,不如花少量bit存储多少个0)
11.舍入是浮点数的概念,定点数没有舍入这个概念。浮点数舍入有两种情况:对阶和右规格化
舍入不一定产生误差,如向下舍入11.00到11.0时没有误差
12.不是IEEE754的浮点数规格化后小数点后面的最高位是1就行
13.浮点数溢出看的是阶码而不是尾数,阶码溢出才会让浮点数溢出
14.IEEE 754的非规格化的阶码 的 float偏置是固定126而不是127
double的是1022而不是1023