前言

目前正在备考 24 考研,现将 24 计算机 408 学习整理的知识点进行汇总整理。

博主博客文章目录索引:博客目录索引 (持续更新)

一、数制与编码

1.1、进位计数制

1.1.1、计数方法(最古老计数方法、十进制计数、r 进制计数)

最古老的计数方法:一开始是以基本字符来进行表示的数字,其有一个缺陷就是当我们要表示更大的数字之后,此时我们就需要去构造更大的字符,如之后的 10000、100000 等等,这就产生出了弊端。

  • 其中 MDCCCLXXXVIII:表示 1 个 1000 + 1 个 500 + 3 个 100…,最终通过加法思路来得到这个数字。

十进制计数法

位权·:根据对应数字的位置来去表示的权重。

  • 人有 10 根手指,能够逢十进一,比较符合人类的规律。

推广:r 进制计数法

六十进制:时间

计算机中通常使用的是二进制、八进制、十六进制。不同的 r 进制需要逢 r 进 1。

基数:每个数码位所用到的不同符号的个数,r 进制的基数为 r。

1.1.2、进制转换

①任意进制转为十进制

②二进制转八进制、十六进制

③八进制、十六进制转二进制

④十进制转任意进制(包含整数、小数,拼凑法)

针对于十进制整数部分处理:不断的通过除法取余得到位数

针对于十进制小数部分处理:

十进制转二进制(拼凑法)

对于十进制转八进制或者其他的,可以先去转为二进制,接着二进制再去转对应的 r 进制:如下借助上面的例子继续往下,最后得到的八进制数为 1025.1

1.1.3、各种进制的常见书写方式

1.1.4、真值和机器数

知识回顾与重要考点

1.2、BCD 码

1.2.1、认识 BCD 码

四个 bit 位来对应一个十进制位

1.2.2、认识 BCD 的编码方式:8421 码(有权码)

第一种 BCD 码的编码方式为:8421,即每 4 位表示一个数字

对于 8421 如何进行加法计算呢

①手算方式:首先使用十进制来加到结果,接着转换为 8421 表示。

②计算机方式:

步骤:①首先直接进行二进制计算。②判断是否在 0-9 中且在 1010-1111 中有定义,若是在直接表示,若是不在 + 6。③得到的结果用 8421 方式四位表示一位对应。

示例对于 9+9 情况:18 的二进制为 10010,实际上这个整体已经超过了 1010-1111,则也要进行 + 6,此时修正得到为 11000,也就是 18。

注意:若是相加结果在合法范围中,则无需修正。

1.2.3、余三码(无权码)

余三码指的是在 8421 码上 + 3 来得到一个新的映射方案。

在 8421 码中,每个位都有固定的权值,表示的四位,分别是 8、4、2、1;在余三码中每位并没有固定的权值。

  • 8421 称为有权码,余 3 码称为无权码。

1.2.4、2421 码

同样也是用 4 位来进行表示,分别权值从左到右位 2 4 2 1:

为了避免有歧义,例如 5 也可以使用 0101 表示,也可以使用 1011 表示,此时就对 2421 码来做了一个规定。

规约:0-4 中的第一位为 0,5-9 中第一位为 1!!!

知识回顾与重要考点

1.3、无符号整数

无符号整数在计算机中的应用:

1.3.1、无符号整数在计算机内部表示

讲解说明按照字长 8 位来进行介绍,目前一般系统的机器字长为 64 位或 32 位。

无符号在二进制中不包含有符号位,不够 8 位的都可以进行补 0:

若是真值大小超过二进制 8 位,那么会只保留低 8 位在寄存器中,多余的将会省略。

1.3.2、无符号整数的加法运算

直接从低位开始加到高位:

1.3.3、无符号整数的减法运算

减法:将减法变为加法操作。

步骤:①被减数不变,减数全部取反 + 1。②接着按照加法运算计算得到二进制数。

举例:A=99,B=9,A-B=90

A = 01100011
B = 00001001
 
①被减数不变 A = 01100011,减数全部取反+1 => 11110111
②加法运算
+ 11110111
-----------
 101011010  => 90

知识点回顾

1.4、带符号符号的表示与运算(含原 / 反 / 补)

对于同一个数可以在计算机中采用不同的原反补码表示:

知识补充(原、反、补转换,原码转补码快速方法)

正数:原反补不变。

负数:反码为正数取反,补码为反码 + 1。

  • 上述负数转换是机器转换的过程!

对于负数的原码转换为补码的快速方法:手算十分推荐

1.4.1、带符号整数的表示(原码)

同样使用的是机器字长 8 位来进行演示!

原码符号位表示

若是没有指明机器字长,对于 x=-19,可以表示为 [x] 原 =1,10011

  • 符号位带上逗号!

1.4.2、原码的加减法运算

原码的加减法运算:若是按照原先的按位加减则最后结果会有错误,需要设计复杂的硬件电路才可处理

实际最终可采用补码方式来进行运算!

1.4.3、补码的加法运算

补码的加法运算:加法的规则与之前一样

示例 1:正数 + 负数,最终的补码需要先进行转换为原码后才能得到它的结果值:

示例 2:负数 + 负数

1.4.4、补码的减法运算

补码的减法运算如何实现:一句话原本 [A] 补 - [B] 补 = [A] 补 + [-B] 补

示例 1:

知识点回顾与总结

1.5、原 / 反 / 补码的特性对比

这里有一个小技巧:对于判断是否溢出,我们可以先手动计算他们的合并值,若是超过了对应码的范围,那么就表示溢出了。

1.6、移码

1.6.1、认识移码

如何得到移码?从补码的基础上符号位取反就可以得到移码。

移码只能够表示整数,无法表示小数,真值 0 只有一种表示形式,其表示范围与补码一致!

按照无符号整数来解读的话,此时移码刚好位 0-255。

移码应用:一般用于浮点数的阶码。

1.6.2、用几种码表示整数(新增移码部分)

1.6.3、各种码的基本特性总结(包含移码)

各种码的对比包含移码:

1.7、定点整数(带符号整数)、小数

1.7.1、定点小数的表示(包含原、反、补)

带符号整数默认称为定点整数,默认是定在最后一个位置。

定点整数:小数点位置在最后末尾。

  • 编码包含:原码、反码、补码、移码。

定点小数:小数点位置在符号位后一位。

  • 编码包含:原、反、补码。

定点小数的原码表示:根据小数点的位置来确定位权。

关于定点小数的反码与补码:与定点整数一模一样

1.7.2、定点小数的加减法运算

定点小数的加减法运算:与定点整数一模一样

1.7.3、定点整数与定点小数的对比(合法范围、位数扩展位置)

合法范围

位数扩展位置不一样:小数直接扩展到末尾,整数扩展到符号位

1.7.4、小数补码的加减法运算

加法运算

减法运算

小数补码的减法运算:与之前的整数一致

二、运算方法和运算电路

2.1、基本运算部件

如何使用硬件实现加法是一个重要探讨的问题!

2.1.1、认识 ALU 算数逻辑单元(包含部件及 ALU 实例)

算数逻辑运算单元

ALU 控制信号部件

  • 其中 Ai、Bi 表示的输入信号,对应的 Fi 即为输出信号。
  • 其中控制单元负责解析指令的含义,一条指令是加法、减法还是其他逻辑运算的指令,CU 解析完指令之后会发出一些控制信号,每一个信号就是高低电平。

下面是 ALU 的实例:74181 的 4 位 ALU

①M=1 表示逻辑运算(若是 0 表示算数运算),其他 s0-s3 表示的是对应的指令操作,4 个可以表示 16 种。

  • 这一块芯片可以支持逻辑运算的 16 种以及算数运算的 16 种。

②A 与 B 表示可以输入 4bit 的数据,之后 ALU 经过加减乘除之后也会输出 4bit 的输出 Fi。

③机器字长实际上就是指的是 ALU 中可以支持同时输入多少个 bit 的信息(本质)。

④对应运算器中的 X 寄存器位数通常与 ALU 中的寄存器位数一致。

⑤这一部分输入与输出信号实际是与其他的芯片进行串联而设计的,具体什么作用暂时不深究。

2.1.2、电路基础知识

2.1.2.1、逻辑运算

最基本的逻辑运算:无论在复杂的算数运算、逻辑运算都是通过最基本的逻辑运算实现的(1 个 bit 位实现)

  • 通过使用门电路来实现的逻辑运算(本质上就是高低电平)

通过不同的结合律我们可以使用不同数量的电路元器件来实现

  • 若是与逻辑与或逻辑同时出现,那么根据优先级来决定谁先执行。
  • 可以看到左边的 A(C+D) 只需要使用两个元器件,而右边的 AC+AD 则需要三个元器件,那么通过这个例子实际就可以很明显的看出通过简化逻辑表达式可以减少电器元件的使用,从而实现节约开销。
2.1.2.2、复合逻辑运算

其中异或天然逻辑可以实现加法、奇偶校验。

2.1.3、异或门电路实际应用

2.1.3.1、门电路实现偶校验位例子

偶检验:1 的数量有偶数个

  • 对偶数个 1 进行异或结果为 0。对奇数个 1 进行异或最终异或结果为 1。

如何用电路来实现?门电路来求偶校验位例子。

2.1.3.2、异或门实现加法运算(一位全加器)

异或门如何实现加法运算?一位全加器。

通过输入的 Ai、Bi 以及来自低位的进位 Ci-1 来去输出得到 Si、Ci,这个过程我们是可以使用异或来实现的。

2.1.3.3、通过一位全加器来实现多位的加法(串行加法器、并行加法器)

第一种:串行加法器

实现过程:输入 Ai 与 Bi 接着读取到上次的进位值,进行一位加法器运算,得到的 Ci 进位值会保存到进位触发器中,之后再次进行一位加法器的时候就可以读取进行运算。

第二种:并行加法器

只有低位的算出来了,高位的才可以去进行计算:

运算速度取决于前一个进位的产生速度。

知识点回顾与总结

2.2、深入理解并行加法器的优化(实现并行的突破点)

基于之前的一位加法器,此时要探讨的问题是,如何更快的产生进位?、

原本计算 Ci 的式子展开可以见下图,每一个 Ci 都会依赖上一个 Ci-1,那么我们是否能够通过一些方式在计算每一个 Ci 的时候无需使用上一个 Ci 呢

  • 这就涉及到并行加法器的优化了,我们让 Gi = AiBi,Pi = Ai 异或 Bi。

接着重新带入到 Ci 的式子当中去,举个例子,我们将 C1=G1+P1C0 代入到 C2 当中去,可以看到 C2 的式子:

我们可以惊奇的发现此时 C2 中仅仅依赖的只是最原始的 C0,按照这样的方法同样带入到其他的 Ci 当中去呢?同样每一个新的 Ci 都仅仅只依赖于最原始的 C0,这样子有什么好处?

  • 我们这样设想,对于计算 Ci 我们可以不再依赖之前的串行顺序,而是可以通过并行来进行同时计算多个 Ci,直到最后计算完成所有的 Ci 之后,此时统一再进行处理。

最终构成就是上图的 4 位 CLA 加法器,其中多是由 FA 和一些新的线路、运算逻辑组成。

所以并行加法器的优化我们可以总结一下:原本 Ci 在没有进行式子完全展示开始时貌似是依赖于上一个也就是 Ci-1,实际我们进行展开后实际每个 Ci 仅仅只是依赖于 C0,那么对于 Ci 的计算无需按照串行顺序,可以使用并行技术来进行计算,直至所有的 Ci 计算完成后统一进行计算处理。

2.3、补码加减运算器

2.3.1、加法器原理

加法器主要包含下边的两个输入端被加数 A 与被加数 B,右边是低位的进位,左边是最高位的进位,上边则是相加的结果:

2.3.2、补码加减运算硬件电路实现

①补码加减运算的手算方式

下面例 1:计算 X-Y 得到的结果为 - 15,实际上已经小于最小的值了,溢出了

②补码加减法运算硬件实现(溢出问题需要由标志位来决定)

硬件实现思路(无标志位)

对于下方的加法器不仅仅对补码加减法有用,还可对无符号数加减法使用!

补码加减法运算在机器中的实现,下面同样是在之前介绍的加法器中 进行改进:

加法运算如下,由于是 +,那么右边的 Sub 即为 0,同样 Y 输入的减数由于控制信号传来的是 0 直接传入到加法器中参与运算,此时加法器右边的 Cin=0,最终会将 A、B、Cin 加起来:

若是进行减法,手算的思路是令 B 的各个位全部取反 + 1,此时在加法器中怎么实现呢?

由于是减法,此时 Sub 控制信号为 1,那么当 Y 输入进来的时候会走 1 这条路,会对所有位进行取反后传入到加法器里,在对于 Cin 此时由于是减法传入的值是 1,那么也就相应的与我们的手算思路一致,只不过这个 1 是由 Cin 来传入的:

上述逻辑规则如下

但此时还是有一个问题,那么就是在进行加减法过程中,对于溢出情况如何判断呢?我们各自对无符号数以及有符号数进行举例:

有符号数举例:

无符号数举例:

溢出情况举例梳理:

无符号数 X=3,Y=4
用4bit表示,X=0011B,Y=0100B
X-Y=0011 + (1011+1) = 1111B=15D ×
解释:实际最终求得的值为-1,而通过目前加法器流程可直接得到15是有问题的
 
有符号数举例:
4bit补码,X=-8,Y=7
X补 = 1000,Y补=0111
X-Y=1000 + (1000 + 1) = 10001 = 1D
解释:实际最终求得的值为-15,表示数的只有3位,直接溢出了

对于上面的溢出情况,作为硬件的机器如何判断呢?下面是就出现了我们要介绍的标志位。

③标志位的生成(含义及详细示例解释)

四个标志位如下画圈的位置:

四个标志位

  • OF 标志位(Overflow Flag 溢出标志):为最高位以及次高位的异或结果值。若是 OF 为 1 表示溢出,为 0 表示没有溢出。与无符号位无关。
  • SF 标志位(Sign Flag 符号标志):结果为负时置 1,否则置 0。与无符号位无关。
  • ZF 标志位(Zero Flag 零标志):运算结果为 0 置 1,否则置 0。
  • CF 标志位(Carry Flag 进位 / 借位标志):发生进位 / 借位时置 1,否则置 0【CF= Cout ^ Sub,其中 Cout 值得是最高位进位值,Sub 指的是加法还是减法,加法就是 0,减法就是 1】,若是最终 CF 为 1 那么就表示溢出。与有符号数无意义。

根据上面的标志位来进行一一解释

①示例:针对有符号数,下面黄色框选出来的就是最高位与次高位

无溢出情况:

有溢出情况:

②示例:针对有符号数

下面紫色圈出来的我们就可以去得到 SF 标志位了,若是 1 则表示负数,SF 置 1,若是 0 表示正数,SF 置 0:

③示例:若是最终结果 n 个数都为 0,那么就置为 1,否则置为 0。

④示例:针对于无符号数

是拿最高位进位与当前是进行加法还是减法操作(加法为 0,减法为 1)进行异或得到的值判断是否溢出,若是为 1 表示溢出,若是为 0 表示没有溢出。

2.4、定点数的移位运算

2.4.1、算数移位

2.4.1.1、认识算数移位

可以通过算数移位来实现乘法、除法运算:

2.4.1.2、定点整数与小数的算数右移与左移(原码)

定点整数

算数右移(实现除法):①其中移出 2 位时,移出去的一位我们可以省去;②移出 3 位时,由于范围有限,就需要将移出的 1 省去,此时则丢失精度。

算数左移(实现乘法):①其中左移 2 位时,由于 2 倍乘为 160,超过了原本范围的最大数 127,此时就会出现计算出错的情况,实际省掉了最前的 1。②其中左移 3 位时再次省略掉了前缀 1,此时为 - 32。

定点小数

定点小数:算数移位与定点整数一致

2.4.1.3、算数移位(补码)

2.4.1.4、算数移位的精简总结(原、反、补)

2.4.1.5、算数移位的应用

通过进行左移操作我们来实现乘法,如下:我们将乘数 7 可拆分为 2 的倍乘形式,拆好之后我们实际上可以看做是多个左移运算动作最后进行相加即可求得最终的乘积值

2.4.2、逻辑移位

2.4.2.1、认识逻辑移位

2.4.2.2、逻辑移位的应用

对于使用三个 bit 字节来存储 RGB 值,可以通过进行逻辑左移来实现移动高 8 位,中 8 位,低 8 位的值,最终相加得到一个完整的 RGB。

2.4.3、循环移位(含介绍与应用)

循环移位:左移与右移移出去的数字会在原本的末尾补上,达到循环的效果

实际应用:通过对一个字形编码其大端到小端之间的状态转换可以使用循环移位。

知识点总体回顾

2.5、乘法运算

2.5.1、手算十进制与二进制乘法运算

手算十进制乘法

手算二进制乘法

2.5.2、原码一位乘法

2.5.2.1、硬件机器实现原码一位乘法(详细)

硬件机器实现原码一位乘法:

初始时 ACC 寄存器会清零:

清零之后 MQ 的最后一位开始参与运算,最后一位为 1,1 * 0.1101,此时进行相加:

00000 + 01101 = 01101

此时开始进行逻辑右移:这一步实际上我们将之前参与 MQ 最后的一位移除,因为这一位已经用过了所以可直接省略,让 ACC 的第一位来填充 0,方便之后添加新的数据

此时我们完成的运算可以如下图所示:也就是得到的乘积,然后补了一个 0,方便之后进行算数移位乘法后进行相加

此时 MQ 最后一位还是 1,接着进行乘法运算后再次进行加法运算,完成加法运算后我们进行逻辑右移:

加法运算:

逻辑右移:

之后的过程如上面一样,进行剩余数的乘积…

最终将 MQ 中的 01011 都进行乘法运算后进行累加到 ACC 中即可完成得到最终的一个乘积值:

2.5.2.2、手算模拟原码乘法

手算模拟:实际我们的手算也就是来对机器硬件进行模拟计算,详细过程如下展示

1、求得 x 与 y 的绝对值,初始 ACC 从 0 开始。

2、使用 MQ 最后一位来乘上被乘数相加 ACC,最后进行逻辑右移操作,即可完成一轮乘法。

3、最终 MQ 的各个数都完成了乘法累加后,我们来使用乘数与被乘数的符号值进行异或确定乘法的标志位。

下面使用的是小数乘法的例子,对于整数原码乘法也是类似的:

2.5.3、补码一位乘法

对比原码一位乘法进行计算:

2.5.3.1、硬件机器实现补码一位乘法

硬件实现运算:对于 MQ 多加了一位用于存储辅助位,实际 MQ 共 n+2 位

对于这种情况由于 MQ 多增加了一位,此时对于 ACC 与 X 都会增加一位,此时多出来的一位则采用双符号位来进行运算:

在这个过程中,每次加法可能会 +[x] 补、+[-x] 补,这个 [-x] 补会有辅助电路来给我们快速转换实现,通过辅助电路的处理之后送到 ALU!

2.5.3.2、手算模拟补码乘法

手算模拟的实现过程:

1、初始 ACC 从 0 开始,符号位直接参与运算,ACC 多增加一位。

2、通过比较 Yi - Yi-1 来确定 +[x] 补、0、+[-x] 补来相加 ACC,最后进行算数右移,即可完成一轮乘法,总共进行 n+1 轮。

3、最终求得的值即为最后的补码乘法结果值。

知识点回顾

每次算得到的一位乘除数来最靠近当前的被除数的值:

手算二进制除法:每一位要么是 0 要么就是 1,来去不断拼凑

2.6、除法运算

2.6.1、原码除法计算(恢复余数法及加减交替法)

2.6.1.1、机器硬件模拟实现原码除法(恢复余数法及加减交替法)

机器硬件实现:

首先商会进行初始化:

接着对于恢复余数法,计算机会默认先直接商 1,若是得到的结尾为负数,则会更改商 0:

这个商 1 后发现结果为负数,又改为商 0 得到的结果如下:

此时则 ACC、MQ 会进行统一的逻辑左移:

之后的步骤同样如此,最终即可得到最后的结果:

其中符号位是根据被除数、余数的符号位异或得到的。

2.6.1.2、手算原码除法(恢复余数法)

手算模拟恢复余数法:一开始直接商 1,若是结果为负数,表示商错了改为 0,此时之后的步骤则是根据第一次的结果值来进行 +[y] 补、+[-y] 补。

可以看到第一次直接商 1,得到负数后我们修改重新为商 0,此时需要重新进行计算,如下:

  • 其实上图中的后两个左移是由于直接商 1 得到的是负数,才不需要恢复的,这个点一定要注意下!
2.6.1.3、优化恢复余数法采用加减交替法(也称不恢复余数法)

** 对于恢复余数法有没有优化的点呢?** 如:若是余数为负,则可直接商 0,并让余数左移 1 位再加上 | 除数 |。

  • 在这个过程里并没有恢复余数,而是直接跳到下一步,基于这种思路的原码除法,叫做加减交替法(不恢复余数法)。

额外补充

注意:若是使用加减交替法,则需要加减 n+1 次,左移 n 次,若是最后的余数为负,则需要商 0,并 +[|y|] 补得到正确余数。

扩展说明定点小数问题(被除数要 < 除数)

定点小数的除法运算,最终得到的一个商也只能是一个定点小数,而不能够是一个整数。因此在定点数的除法运算当中,我们会规定被除数一定要小于除数,若是被除数大于除数,最终商的结果一定会大于 1,而定点小数无法大于 1,对于硬件如何检查被除数与除数的大小关系呢?

  • 主要是通过第一步的商来决定的,若是第一次 +[-|y|] 补得到的值为正数,那么就表示被除数是 > 除数的,此时硬件电路会直接停止运算,这种除法是无法使用定点小数来表示的。
  • 若是为负数,则表示是正常的,此时则表示 0 继续往下执行。

2.6.2、补码除法计算(加减交替法)

对于补码除法的细节点见如下的右边,包含补码除法的细节以及关于初始加减法及过程中商 0/1 情况

注意点

1、补码除法加减交替法与原码有些不同,初始加减是根据被除数与除数是否为同号而对于商 1 还是商 0,是根据余数与除数(这里除数指的是原本题目中的除数,而不是过程中的除数)。

2、最后一次左移加法完成之后,统一在最后末尾商恒置为 1。这么做的目的就是省事,精度误差不超过 2-n。

原码加减交替法与加减交替法的区别

2.7、C 语言类型转换

对于 int、short、long 都是采用补码形式来进行存储的,使用 unsigned 就表示是无符号数。

①short 转 unsigned short(无符号转有符号数同类型):也就是原本会把开头第一位看做是符号位,转为 unsigned 之后则不会将第一位看作是符号位

②int 转 short:也就是 4 个字节的转 2 个字节的,高位截断,保留低位

③short 转 int:2 个字节的转为 4 个字节的

注意:对于定点整数补码来说若是一个负数,那么高位全部补 1,若是为整数,高位全部补 0。

④unsigned short 转 unsigned int:2 个字节的转为 4 个字节的

注意:在这里可以跟③有个对比,若是本身是正数,其符号位为 0,那么高位也是填充 0。

2.8、数据的存储与排列

2.8.1、大小端模式

对于大小端模式实际上就是存储几个字内容的顺序不一样:

  • 大端模式:从 4 个字节的从前往后依次存储在指定顺序的内存地址中。
  • 小端模式:从 4 个字节的从后往前依次存储在指定顺序的内存地址中。

对于机器处理更适合采用小端方式存储的原因?

  • 例如进行加法运算的时候,往常都是从低位开始进行运算的,而小端模式的存储方式就是从低位到高位存储的,读取是按照内存递增的顺序来进行的,所以很符合计算机的存储方式。

2.8.2、认识计算机编址

假设存储字长为 32 位,1 个字就是 32 位,半字就是 16 位,每次访存可以读 / 写一个字,也就是下面画圈的一大部分 32 位,计算机是按照一个字节来进行编址:

若是按照字节来编址,给你说让你根据指定字来寻址,我们可以将字转换为字节然后确定具体位置:例如存储字长为 32 位,此时字就是 32 位,字节是 8 位,让你去找 2 号字,我们首先去将 2 转为二进制位 10,接着逻辑左移 2 位即为 1000,此时就相当于 * 4,从而来确定确切的地址位置。

2.8.3、边界对齐方式与边界不对齐方式边界对齐

现在有一个场景:我们依次写入 3 个字节,接着写入 3 个半字,对于这种情况采用边界对齐与不对齐方式就会影响我们的实际存储方式

边界对齐如下表所示:

  • 由于一个字长为 32 位,此时一行相当于可以存储 4 个字节,按照上述场景,我们依次写入 3 个字节后,要写入一个半字,此时由于剩余的一行只剩余一个字节了,由于我们采用的是边界对齐方式,会将这一个半字写入到下一行当中。

边界不对齐如下表所示:

  • 由于一个字长为 32 位,此时一行相当于可以存储 4 个字节,按照上述场景,我们依次写入 3 个字节后,要写入一个半字,此时由于剩余的一行只剩余一个字节了,由于我们采用的是边界不对齐方式,会继续存储到这一行中直至塞满这一行,此时这一行最后 8 位存储的是半个字。

为什么有两种方式存储呢?区别

  • 采用边界对齐方式:空间换时间,若是读取上述的第一个字时,只需要访存一次即可,直接读取第二行。
  • 采用边界不对齐方式:可以有效的利用存储空间,不浪费,但是对于我们要读取指定的一个字时,由于一个字拆分两部分一部分存储第一行最后,另一部分存储在第二行中,那么由于我们读 / 写是一个字一个字,此时就需要两次访存,时间开销就变大了。

三、浮点数的表示与运算

浮点数的局限性如下

认识十进制的科学计数法

3.1、浮点数的表示

3.1.1、认识浮点数的表示

二进制的浮点数原理

针对于阶码与尾数对应表示的含义

实际案例:根据给出的阶码尾数来表示求 a,b 的真值。

例 1:

若是最后使用 1B 来存储 a 的真值,那么是正好可以表示的,阶码为 001,尾数为 11001,合并起来正好为 8 位。

3.1.2、浮点数的规格化及示例

例 2:引出浮点数尾数的规格化

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-FYGoQiAf-1685321272499)(https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2023/1/image-20230527155226344.png)]

介绍下十进制科学计数法规格化

  • 对于一个十进制位可以使用两种方式来表示,而最终表示应当为 + 3.026 更为贴切,尽管另一种 0.003 也可以来表示,但是却丧失了精度。
  • 科学计数法规定了最高位为一个有效值,不能为 0,在尾数相同长的时候尽可能规定尾数的最高位不能为 0。

接着回到例 2:我们可以对尾数进行左移一位,此时阶码要减去一位。这样做的目的是让尽可能保留更多的精度

浮点数尾数的规格化:认识左规与右规

  • 对于左规与右规使用时机要确定,当非规格化时需要进行算数左移,若是溢出才会是算数右移。

规划化示例

尾数的符号位为 01,此时采用右规,即可挽救溢出的情况。

3.1.3、规格化浮点数的特点

规格化浮点数的特点:原码、补码

注意:补码负数表示尾数进行规格化时要注意为 1.01xxxx 形式。

示例:下图中给出的 1.1110100 并不是规格化要求,因为其是负数补码,应当为 1.01xxxx 形式,所以此时需要进行算数左移。

3.1.4、浮点数的范围

如下图:若是比 0.00001 还要小,那么此时可以表示为正下溢;而对于负下溢,若是绝对值已经超出了最小的范围即可表示。

知识点回顾

3.2、IEEE 754(浮点数标准)

3.2.1、IEEE 754 中的移码表示与定义

IEEE 754 中阶码是采用移码来进行表示的:

  • 注意移码只能够用于表示整数,这也是为什么阶码来用移码表示的一个原因。

3.2.2、移码定义(偏置值为 128、127 情况举例)

移码最原生定义:移码 = 真值 + 偏置量(这里真值指的就是原码值)

下面举的例子尾数都是按照补码表示的

①偏置值为 128D 情况

这里我们给出一组真值、补码以及移码,表中的移码可以通过我们上面的公式来获取:

②偏置值为 127D 情况

偏置值为 127D 时左边表中最右侧的就是对应真值的移码,我们来首先尝试去计算第一个 - 128 的移码,可以看到是一个减法计算,被减数 < 减数,此时我们可以多加一个位

  • 该情况下的移码值如上图课件除了第一个数为 255,下面的依次为 1-254。

3.2.3、IEEE 754 标准浮点数表示

在这里阶码是采用移码,尾数是采用补码表示的

  • 对于 float 中尾数数值为 23 位实际上指的是 1.M 中的 M,这个 1 是默认就有的。

拿 float 来进行举例

①其阶码真值范围是 - 126-127,是根据偏置值来决定的,少了的两个分别是全一的 - 128,全 0 对应的 - 127,这两个状态会用作特殊的处理。

  • 可看下之前的图最后一列的第一第二行,全 1 或全 0。

  • 其中 float 十进制的偏置值怎么算?28-1 - 1 = 127。

我们来看一个规格化浮点数来求的真值的情况:

②double 类型:

3.2.4、实际案例计算(真值与单精度浮点数相互转换例子)

1、给定真值,让你求单精度浮点数格式表示

  • 由于 IEEE 754 对于尾数的整数部分隐含了 1.,所以这里要转为 1.xxxx。

2、给定单精度浮点数格式让你求真值

3.2.5、IEEE 754 单精度浮点型多种阶码与尾数不同情况(最大值、最小值)

IEEE 754 单精度浮点型能够表示的最小绝对值,最大绝对值是多少?

下面是多种阶码与尾数不同情况取得值:

知识点回顾总结

3.3、浮点数的计算

3.3.1、浮点数的加减运算

以十进制来进行举例步骤如下

①对阶:小阶向大阶靠齐。

  • 若是不向大阶靠齐,那么尾数部分的值就会很大,每大一位就是多占一个位置,例如原本的 0.9854 x 105,若是阶数变小,此时就为 985.4 x 102,此时你可以看到在尾数部分就直接多了三位,而若是仅仅只在阶数中呢?
    • 这里原码表示下:原本为 5 就是 101,此时为 2 也仅仅是 10,此时少了一位却换来了多三位,肯定不好。这也是上述不向大阶靠齐的一个原因。
    • 同样也方便计算机对尾数进行处理。

②尾数加减

③规格化:保证尾数的第一个数值位是有一个有效位。

④舍入:尾数的比特位是有限的,在尾数加减截断可能尾数过长,所以需要进行舍入。对于舍入的策略有多种方式。

⑤判溢出:阶码超过指定范围则溢出。

注意:在第⑤步判断溢出时若是溢出,此时我们可以在③④步中进行拯救。

3.3.2、浮点数加减实际案例

浮点数的加减运算实际案例:

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-oII0VATH-1685321272510)(https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2023/1/%E6%97%A0%E6%A0%87%E9%A2%98.png)]

3.3.3、舍入情况

两种输入方式

①0 舍 1 入法

示例如下:对于下面示例是末尾 + 1,原本为 01,+1 之后为 10

②恒置 1 法

注意点如下

3.3.4、强制类型转换问题

考试考察时大多是 32 位的,目前主流都是 64 位。

无损转换,数据精度不会丢失

int 转 float 型会有精度的损失:其中 int 是 1+31,而 float 是 1+8+23,其中 23 实际还隐含了一位 (可以表示 1+23=24 位)

本节回顾

整理者:长路 时间:2023.5.22-5.2