免责声明:
- 笔记来源:本系列所有笔记均整理自 B站·王道考研·计算机组成原理 视频教程
- 参考书籍:《2021年计算机组成原理考研复习指导》,王道论坛所著,电子工业出版社出版,ISBN :9787121379826。
1 数制与编码
在计算机内部,所有的信息都以二进制表示,因为:
- 二进制只有0和1两种状态,可以使用有两个文档状态的物理器件就能方便的表示二进制(例如高低电平或者电荷正负极),实现简单、制造成本相对较低。
- 二进制只有0和1刚好和真假值对应,便于进行逻辑运算和判断。通过逻辑门电路可以很方便的实现算术运算。
1.1 进位计数制
计算机中常用的进制有二进制、八进制、十六进制,而我们常用的是十进制。
进制间转换
进制中的基数
每个数位所用到的不同数码的个数叫做基数。
- 二进制的基数为2,每一个数码都可能是(
0-1
)之间的任何一个 - 八进制的基数为8,每一个数码都可能是(
0-7
)之间的任何一个 - 十进制的基数为10,每一个数码都可能是(
0-9
)之间的任何一个 - 16进制的基数为16,每一个数码都可能是(
0-9,A,B,C,D,E,F
)之间的任何一个(A,B,C,D,E,F
分别表示10,11,12,13,14,15
)
二进制、八进制、十六进制互转
- 对于整数部分,从小数点开始,往左数,三位为一组(不足的在最左边补0对齐)
- 对于小数部分,从小数点开始,往右数,三位为一组(不足的在最右边补0对齐)
- 每一组三位的二进制代码就表示八进制的一位
例如:二进制 1111000010.01101,转为八进制:
整数部分: 1111000010
三位一组,分为四组(最左边补两个0凑足12位):001 111 000 010
每一组分别转为对于的八进制:
001→1
111→7
000→0
010→2
小数部分:01101
三位为一组,分为两组(最右边补一个0凑足6位):011 010
每一组分别转为对应的八进制:
011→3
010→2
最终转为八进制结果为:1702.32
为什么三位的二进制对应一位八进制呢?因为2^3 = 8
。
二进制转十六进制的原理与转八进制的原理一致,只不过因为2^4 = 16
,所以四位二进制对应一位十六进制。
如果要进行十六进制与八进制互转,可以先转为二进制,再转为目标进制。
其他进制转为十进制
按权展开相加法:各位数码与权值相乘,再把乘积相加。(整数部分最低位为第 0 位,小数部分最高位为第 1 为)
例如,
二进制转十进制 11011.1 = 1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 + 1 * 2^-1 = 27.5
八进制转十进制 3127.25 = 3 * 8^3 + 1 * 8^2 + 2 * 8^1 + 7 * 8^0 + 2 * 8^-1 + 5 * 8^-2 = 1623.328125
十六进制转十进制AE86.14 = 10 * 16^3 + 14 * 16^2 + 8 * 16^1 + 6 * 16^0 + 1 * 16^-1 + 4 * 16^-2 = .44678.078125
十进制转其他进制
十进制数转为其他进制,对于整数部分,采用除基取余法;对于小数部分,采用乘基取整法。
-
除基取余法:整数部分除以基数,取余数,如果商为0,结束,如果商不为0,继续使用商除以基数,取余数,先取的余数为低位,后取的余数为高位
-
乘基取整法:小数部分乘以基数,取乘积的整数部分,当乘积为 1.0 或者满足精度要求时结束,否则继续使用乘积的小数部分乘以基数,先取的整数为高位,后取的整数为低位
例如:十进制 123.6875
,转为二进制,结果为 1111011.1011
① 整数部分:结果为1111011
② 小数部分:0.1011
注意,并不是每一个十进制的小数都能使用二进制准确的表示,比如 十进制的0.3转为二进制,无法得到精确的转换结果。
真值与机器数
- 真值:平常我们使用的带正负号表示的数(整数一般省略正号),就是真值。
- 机器数:将数的符号进行数字化(通常,使用 0表示正数、1表示负数)与数值一起编码的数就是机器数。
- 真值是机器数所代表的实际值
比如,真值 -5
,对应的机器数为 1 101
(最高位为符号位,1表示负数)
BCD码
所谓BCD(Binary-Coded Decimal)码,就是采用二进制编码的十进制数。
通常采用四位2进制数表示一位十进制中的十个数码(0-9
),便于二进制和十进制间快速转换。
四位二进制可以表示十六个不同的数码,因此用来表示十进制必然会有6个状态冗余。
8421码
8421码是一种常见的BCD码,是一种有权码,权值由高到低分别是 8,4,2,1。比如,8421码的各个位上的数分别是 b3,b2,b1,b0
,那么它对应的十进制数就是8*b3 + 4 * b2 + 2*b1 + 1*b0
:
- 如果两个8421码相加结果,小于等于
1001(二进制,即十进制的 9)
,在合法范围内,则不需修正; - 超过了
1001
,需要将运算结果加上0110(二进制,即十进制的6)
,并且高位进位。 - 例如,
0101 + 1000 = 1101
,超过了1001
,为无效码,需要再加上0110
进行修正,最终结果为1101 + 0110 = 1 0011
。
余 3 码
是一种无权码,是在8421码的基础上加上 0011(十进制的3)
形成的。每个数都多余3,因此叫做余3码。
比如 8421码 0100(十进制的4)
变为余3码: 0100 + 0011 = 0111
2421 码
与8421码类似,也是是一种有权码,只是重新定义了权值,权值由高到低分别是 2,4,2,1。
特点是,最小的五个数,高位都是0,最大的五个数,高位都是1。
1.2 字符与字符串的表示
计算机中,所有的信息都是以二进制形式表示,那么,对于字符和字符串,是如何表示的?
ASCII 编码
ASCII 编码是国际上普遍采用的字符编码系统, 使用7位二进制进行编码,可以表示 128(128 = 2^7)个字符:
- 字母:26个英文大写字母[A-Z],26个英文小写字母[a,z]
- 数字:10个十进制数[0,9]
- 符号:32个控制通信字符,其他34个专用字符
其中:
- 编码值 0~31 为控制字符,用于通信、设备控制
- 比如编码 6(0000 0110) 代表 ACK,意义是“确认回应”
- 比如编码 7(0000 0111) 代表 BEL,意义是“响铃”
- 编码值 48(0011 0000)~57(0011 1001),表示数字 [0-9]
- 其低四位正好是二进制形式的[0,9]
- 编码值32~126 为可印刷字符
汉字的表示
汉字的编码包括:
- 输入编码
- 汉字内码
- 汉字字形码
区位码:
- 四位十进制数表示
- 前两位是区码
- 后两位是位码
1.3 校验码
校验码,是用来检错和纠错的数据编码。原理是,通过增加一些冗余码来进行检错或者纠错。
一个编码由多个码字构成,任意两个合法码字之间最少变化的二进制位数,称为码距;码距越大,检错和纠错能力越强。
奇偶校验码
原理
在原来的编码(有效信息位)上,增加一位校验位,组成校验码,校验位可以取值0或者1,使得整个校验码中1的个数变为奇数或者偶数,有两种校验方式:
- 奇校验:整个校验码中,1的个数为奇数
- 偶校验:整个校验码中,1的个数为偶数
例如,原编码1001101,有效信息位中,1的个数为4,偶数个,因此 - 奇校验码为 1 1001101(增加一个1,使得整个校验码中1的个数为奇数)
- 偶校验码为 0 1001101(增加一个0,使得整个校验码中1的个数为偶数)
局限性
有奇数个位发生错误时,才能检测出错误,且不能纠错。
- 如果选择奇校验,原本是应该共有奇数个1,当有奇数个位发生错误(0变成1或者1变成0),都会使得整个编码中的1的个数变成偶数,此时就能改检测出发生了错误,但是无法判断具体发生错误的是哪一个位;而当有偶数个位发生错误时,整个编码中的1的个数依然是奇数,无法检测出发生了错误
- 如果选择偶校验,原本是应该共有偶数个1,当有奇数个位发生错误(0变成1或者1变成0),都会使得整个编码中的1的个数变成奇数,此时就能改检测出发生了错误,但是无法判断具体发生错误的是哪一个位;而当有偶数个位发生错误时,整个编码中的1的个数依然是偶数,无法检测出发生了错误
海明校验码
原理
海明校验码,是一种分组奇偶校验码,实现原理:在有效信息位中,加入几个校验位组成海明码。然后对海明码的每个二进制位进行分组奇偶校验,当某一位出错,就会引起相关的几个校验位变化,因此,既能够检错,也能纠错(校验位标注出错的位置)。
理论公式:L - 1 = D + C 且 D >= C
- L 编码的最小码距
- D 检测错误的位数
- C 纠正错误的位数
求解步骤(有效信息位位数记作 n ,校验位位数记作 k)
假设有效信息为1010
记作D4D3D2D1
① 根据公式2^k >= n + k +1
, n = 4,则
- 校验位位数 k = 3,校验位记作
P3P2P1
- 最终组合成的海明码记作
H7H6H5H4H3H2H1
② 根据规则确定校验位的分布
- 先将校验位 Pi 放在海明码位号为 2^(i-1) 的位置上
- P1→ 放在整个校验码的 2^0 = 1 的位置
- P2→ 放在整个校验码的 2^1 = 2 的位置
- P3→ 放在整个校验码的 2^2 = 4 的位置
- 再将有效信息位按原本的顺序依次放在其他位置上
③ 一个信息位使用符合一定条件的多个校验位进行组合校验
- 被校验的数据位所处的海明码的位号等于校验该数据位的各个校验位所处的海明码的位号之和
- D1 :在海明位号为3的H3位置上,3 = 2 + 1,因此D1由海明位号为2的H2位置上的P2和海明位号为1的H1位置上的P1组合校验,即
[P1,P2] → D1
- D2:在海明位号为5的H5位置上,5 = 4 + 1,因此D2由海明位号为4的H3位置上的P3和海明位号为1的H1位置上的P1组合校验,即
[P1,P3] → D2
- D3:在海明位号为6的H6位置上,6 = 4 + 2,因此D2由海明位号为4的H3位置上的P3和海明位号为2的H2位置上的P2组合校验,即
[P2,P3] → D3
- D4:在海明位号为7的H7位置上,7 = 4 + 2 + 1,因此D4由海明位号为4的H3位置上的P3和海明位号为2的H2位置上的P2以及海明位号为1的H1位置上的P1组合校验,即
[P1,P2,P3] → D4
- D1 :在海明位号为3的H3位置上,3 = 2 + 1,因此D1由海明位号为2的H2位置上的P2和海明位号为1的H1位置上的P1组合校验,即
- 校验位不需要被校验
④ 计算各校验位的值
- 校验位Pi 的值为第 i 组(第 i 个被该校验位校验的数据位)所有位进行异或运算的结果
- P1 参与校验了
D1(0),D2(1),D4(1)
, 因此P1 = D1⊕D2⊕D4 = 0⊕1⊕1 = 0
- P2 参与校验了
D1(0),D3(0),D4(1)
, 因此P2 = D1⊕D3⊕D4 = 0⊕0⊕1 = 1
- P3 参与校验了
D2(0),D3(1),D4(1)
, 因此P3 = D2⊕D3⊕D4 = 1⊕0⊕1 = 0
- P1 参与校验了
最终得出,四位的信息位 1010 ,需要 三位的校验位 010 进行校验,最终的海明校验码为 1010010
⑤ 每个检验组分别用校验位及参与计算出校验位的信息位进行奇偶校验检查,构成k个校验方程
- 第一组校验,P1 参与校验
D1(0),D2(1),D4(1)
:S1 = P1⊕D1⊕D2⊕D4
- 第二组校验,P2 参与校验
D1(0),D3(0),D4(1)
:S2 = P2⊕D1⊕D3⊕D4
- 第三组校验,P3 参与校验
D2(0),D3(1),D4(1)
:S3 = P3⊕D2⊕D3⊕D4
- 最后三个校验方程的结果按原本的顺序组合,如果为000则说明没有出错,否则其表示的数就是海明码中错误的位号。
比如,接收方实际收到的是 1110010
- S1 = 0⊕0⊕1⊕1 = 0
- S2 = 1⊕0⊕1⊕1⊕ = 1
- S3 = 0⊕1⊕1⊕1
- S3S2S1 = 110 = 6,即海明码中第6位 H6 处出现错误
- 因为二进制只有0和1两种状态,直接取反即可进行纠错
CRC循环冗余校验码
基本思想
在 K 个信息位之后添加 R 个校验位,使得整个编码程度为 N ,称之为(N,K)码。发送端与接收端事先约定一个生成多项式用于生成校验码和出错检查。
生成多项式与模二除法求解CRC码
假设信息位为 101001,约定生成多项式为G(x) = x^3 + x^2 + 1
① 算出生成多项式对应的二进制码
- 任何一个二进制数码都可以使用一个系数仅为0或者1的多项式与其对应,
G(x) = x^3 + x^2 + 1
转化为G(x) = 1 * x^3 + 1 * x^2 + 0 * x^1 + 1 * x^0
,所以,生成多项式对应的二进制为 1101(取多项式的系数)。 - 校验位的位数等于生成多项式的最高次幂,即
R = 3
,因此N = K + R = 6 + 3 = 9
② 将原信息码左移R位,即左移三位,低位补零,得出101001000
③对左移后的信息码,使用生成多项式对应的二进制码进行模二除法
- 用除数对被除数最高几位进行异或运算,不错位
- 除数右移一位,如果余数最高位为1则商1,继续对余数进行异或运算(若除数最高位为0,则商0)
- 循环直到余数位数小于除数时,此时的余数就是要求取的校验位
最终得出校验位为001
,则CRC码为101001 001
,记作C9C8C7C6C5C4C3C2C1
④ 检错及纠错
接收方接收到CRC码后(C9C8C7C6C5C4C3C2C1
),使用生成多项式对应的二进制码进行模二除法,若余数为0,则无误,若不为0则余数就是出错位在CRC码中的位号。
例如,假如接收到的是 C9C8C7C6C5C4C3C2C1 = 100001001
,使用 1101
进行模二除法,余数为110
(十进制的7),因此可以知道是C7位发生了错误,直接取反即可纠错。
2 定点数的表示与运算
机器数的表示形式
计算机中,参与运算的机器数有两类:
- 无符号数:整个机器字长的全部二进制位都是数值位,没有符号位,相当于数的绝对值,如果机器字长为n位,那么数的表示范围是
0 ~ 2^n -1
- 有符号数 :约定最高位为符号位,0表示正数,1表示负数,其机器数表示有:
- 真值:X
- 原码:[X]原
- 反码:[X]反
- 补码:[X]补
- 移码:[X]移
机器数的表示根据小数点位置是否固定又分为:
-
定点表示:小数点位置固定,且小数点没有实际表示出来,一般约定其位置
-
整数的小数点固定在最低位至后,称为定点整数
-
小数的小数点固定在最高位值前,称为定点小数
-
-
浮点表示
2.1 定点数的表示
定点数的原码表示
原码
使用机器数的最高位表示数的符号,其余各位表示输的绝对值。若机器数的真值为X
,则其原码记作 [X]原
纯小数的原码
纯整数原码
需要注意的是,真值0的原码表示有两种
- [+0]原:0 000 0000
- [-0]原:1 000 0000
定点数的反码表示
反码
通常作为原码、补码间相互计算的中间过渡,记作 [X]反
- 对于正数
- 反码与原码一致
- 补码与原码一致
- 对于负数
- 反码等于原码符号位不变,数值位全部取反
- 补码等于反码末位加一
纯小数反码
纯整数反码
注意,真值0的反码表示也有两种
- [+0]反:0 000 0000
- [-0]反:1 111 1111
定点数的补码表示
补码
- 正数的补码与原码相同,即
[X]补 = [X]原
- 负数的补码等于原码符号位不变,数值位全部按位取反,再在末尾加一
- 根据负数的补码求其原码,也是补码符号位不变,数值位全部按位取反,再在末尾加一
纯小数补码
纯整数补码
补码的算术移位
补码的符号位与数值位一起右移一位(符号位的值不变),可以实现除二功能
假如真值 X = -6,则:
- [X]原 = 1 000 0110
- [X]反 = 1 111 1001
- [X]补 = 1 111 1010
- [X]补 右移一位(整体右移,符号位的值不变)→ [R]补 = 1 111 101
- [R]原 = 1 000 011→ R = -3 (R代表左移结果)
补码的双符号位
在计算机的完成算术运算的ALU部件中,就采用模4补码双符号位
- 00 表示正
- 11 表示负
补码中的人为定义
在补码表示中,真值0 有表示有
- [+0]补:0000 0000
- [-0]补:0000 0000
补码中有一个特殊的人为规定,将原来的 负0 用来表示一个有效数值,比如字长为 8时,原码的整数的取值最小为 -(2^7 -1)= -127,用补码表示时,将原本无意义的负0用来表示 -128
补码简化加减运算
原码表示的加减操作很复杂,对于两个不同符号数的加法(或同符合数的减法),先要比较两个数的绝对值大小,然后使用较大的绝对值减去较小的绝对值,最后再根据绝对值大小给计算结果选择恰当的符号。
而补码表示法中的加减运算统一使用加法操作实现。
定点数的移码表示
移码
移码就是在真值X上面加上一个常数 2^n ,
移码只能表示整数,通常用来表示浮点数的阶码。
移码等于补码数值位不变,符号位按位取反。
移码保持了数据原有的大小顺序,移码大,真值就大,移码小,真值就小,所以经常用于比较大小。
移码中的0表示唯一:
- 正0 :1000 0000
- 负0:1000 0000
2.2 定点数的运算
移位运算
移位运算分为
- 算术移位:有符号数的移位
- 逻辑移位:操作对象时逻辑代码,可以视为无符号数
算术移位
操作对象时有符号数,移位的过程中,符号位一直不变
- 对于正数:移位过程中,出现的空位都以 0 填充(不论是原码、反码、补码,因为都等于真值)
- 对于负数:
- 原码表示时, 填充 0(因为负数的原码,数值部分与真值相同,移位时只需要保证符号位不变即可,因此都填充0即可)。若不考虑左移时的溢出,则左移一位相当于乘以2;若不考虑右移时丢弃的低位数,则右移一位相当于除以2
- 反码表示时,填充 1(因为负数的反码,数值位与原码相反,因此移位后所填充的码应该与原码相反,即都填充1)
- 补码表示时,对补码从低位到高位找到第一个 1 ,这个1左边的各个位均与对应的反码相同,右边的各个位(包括这个1)都与对应的原码相同,因此:
- 左移填充 0(负数的补码左移时,空位出现在低位,所填充的码应该与原码相同,所以填充0)
- 右移填充 1(负数的补码右移时,空位出现在高位,所填充的码应该与反码相同,所以填充1)
例如真值 X = -53,[X]原 = 1011 0101,左移一位,丢弃符号位右边的0,低位空出补上0
1 011 0101
1 110 101
1 110 1010
结果为1 110 1010 ,对应的真值为 -106 = X * 2。
[X]反 = 1100 1010,左移一位,丢弃符号位右边的1,低位空出补上1
1 100 1010
1 001 010
1 001 0101
结果为 1 001 0101
逻辑右移
将操作数看作无符号数:
- 左移时,高位移丢,低位空出填充0
- 右移时,低位移丢,高位空出填充0
比如,无符号数 1011 0101,逻辑左移一位高位的1丢弃,低位空出 一个位置,补0:
1011 0101
1011 0101
0110 1010
逻辑右移一位低位的1丢弃,高位空出 一个位置,补0:
1011 0101
1011 0101
0101 1010
循环移位
- 大循环:带进位标志(CF)的循环移位
- 小循环:不带进位标志的循环移位
循环移位,移出的数据被从相反方向移入,适合将数据的低字节数据和高字节数据互换。
加减运算
定点数原码加法减规则
-
加法:先判断符号位,若相同,则两个绝对值相加,符号位不变;若不同,则两个绝对值相减(绝对值大的减去绝对值小的),结果的符号位与绝对值大的符号位相同。
-
减法:两个原码表示的数相减,然后将减数符合取反,然后将被减数与符合取反后的减数进行加法运算。
-
当左边位溢出时,将溢出位丢掉
定点数补码加法规则
计算机中普遍采用补码进行加减运算。假设机器字长为 8 ,其特点如下:
- 按二进制运算规则,逢二进一
- 符号位、数值位以同样的规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得出
- 若是加法,两数的补码直接相加
- 若是减法,将被减数与减数的机器负数相加
- 补码运算结果还是补码
符号扩展
符号扩展
假设将一个8位数与一个32位数进行相加,必须先将8位数转为32位数,再进行运算才能得出正确结果。
正数的符号扩展规则
原有形式的符号位移动到新形式的符号位上,新形式上所有附加位都以0填充。
假设机器字长为8(含一个符号位),真值A = 15,B = -24 :
负数的符号扩展规则
- 原码:与正数相同,附加位以0填充
- 补码:
- 整数:所有附加位以1填充
- 小数:所有附加位以0填充
- 反码:所有附加位以1填充
溢出判断
溢出
当运算结果超出机器数能表示的范围称为溢出,仅当同符合相加或者异符合相减才可能会发生结果溢出
- 上溢:运算结果大于能表示的最大正数
- 下溢:运算结果小于能表示的最小负数
溢出判断方式
① 采用一位符号位判断
如果参加运算的两个数,符合相同,但是结果的符号与操作数不同,那么就表示溢出。
② 采用一位符号位根据数据位的进位情况判断
③ 采用双符号位判断
双符号位法也叫做模4补码。
乘法运算
计算机中,乘法运算由累加和右移操作实现。
原码一位乘法
符号位与数值位分开计算:
- 结果的符号位: 由两个操作数的符号异或运算得出
- 结果的数值位:两个操作数的绝对值相乘得出
补码一位乘法(Booth算法)
除法运算
在计算机中,除法运算一般转为逻辑左移操作:“累加——左移”。
原码除法
原码除法主要采用原码加减交替除法(不恢复余数法)。商值和商符分开进行:
补码除法
也叫做补码加减交替除法。符号位与数值位一起参与运算。
- 第一步根据被除数与除数的符号决定做加法还是减法
- 余数与除数同号,上商1,异号上商0,最后一步商恒置1
2.3 强制类型转换
在C语言中,可以在不同数据类型间做强制类型转换。
有符号与无符号数间转换
如下C代码:
int main(){
short x = -4321;
unsigned short y = (unsigned short)x;
unsigned short a = 65535;
short b = (short)a;
printf("x = d%,y = %u\n",x,y);
printf("a = u%,b = %d\n",a,b);
}
(在采用补码的机器上)将有符号的x强制转为无符号的y,结果为:x = -4321 , y = 61215
。将x与y转为二进制形式:
可以看出,x和y的二进制,每一位都是一样的,由此可以看出,将有符号的x强制转为无符号数,仅仅改变了数据的解释形式,其结果按位保持不变。
再例如:
int main(){
unsigned short a = 65535;
short b = (short)a;
printf("a = u%,b = %d\n",a,b);
}
同样在采用补码表示的机器上,无符号数 65535,转为有符号数结果为 -1 。
- 无符号 65535 ,二进制补码形式 1111 1111 1111 1111
- 有符号数 -1 ,二进制补码形式 1111 1111 1111 1111
不同字长整数间强制转换
大字长整型变量强制转为小字长整型变量
如下C代码:
int main(){
int x = 165537;
int u = -34991;
short y = (short)x;
short v = (short)u;
printf("x = %d,y = %d\n",x,y);
printf("u = %d,v = %d\n",u,v);
}
输出结果:
x = 165537,y = -31071
u = -34991,v = 30545
x y u v 对应的十六进制形式为:
- x →0x000286A1
- y →0x86A1
- u →0xffff7751
- v →0x7751
可以看出,长字节类型整型变量强制转为短字节类型整型变量时,系统直接把高位多出字长部分按位截断,低位直接赋值。
小字长整型变量强制转为大字长整型变量
如下C代码:
int main(){
short x = -4321;
int y = x;
unsigned short u = (unsigned short)x;
unsigned int v = u;
printf("x = %d,y = %d\n",x,y);
printf("u = %u,v = %u\n",u,v);
}
输出结果:
x = -4321,y = -4321
u = 61215,y = 61215
x y u v 对应的十六进制形式为:
- x →0xEF1F
- y →0xFFFFEF1F
- u →0xEF1F
- v →0x0000EF1F
不仅要使高位相等,高位部分还会扩展为原数的符号位。
3 浮点数的表示与运算
3.1 浮点数的表示
浮点数表示形式
浮点数规格化
浮点数规格化形式:规定尾数最高位是一个有效值,通过调整尾数和阶码大小来实现,提高运算速度,充分利用尾数的有效数位。
浮点数规格化的特点:
IEEE754标准
IEEE754标准中,尾数采用原码表示,阶码采用移码表示。
3.2 浮点数的运算
浮点数加减运算
阶码与位数分开运算,加减法统一采用补码形式,运算步骤如下:
- 对阶:小阶向大阶对齐
- 尾数求和:尾数按照定点数的加减规则运算
- 规格化:尾数的最高数值位与符号位不同时,即为规格化形式
- 舍入:处理对阶和右规格化时,可能出现的精度丢失问题。0舍1入法、恒置1法
- 溢出判断
C语言浮点数类型转换
4 算术逻辑单元ALU
注:本节非重点
计算机中的运算器负责完成算术运算和逻辑运算。主要组成:
- 算术逻辑单元 ALU
- 累加器 ACC
- 状态寄存器
- 通用寄存器
4.1 加法器
加法器由全加器和其他必要的逻辑电路组成。
逻辑电路
一位全加器
串行加法器
并行加法器