【计算机组成原理】数据的表示与运算

在这里插入图片描述

上期回顾: 【计算机组成原理】计算机系统概述
个人主页:GUIQU.
归属专栏:计算机组成原理

在这里插入图片描述

正文

1. 数据表示基础

1.1 数制及其转换

  • 常用数制
    • 十进制(Decimal):日常生活中最常用的数制,采用 0 - 9 十个数字符号来表示数,逢十进一。例如,数字 25 表示 2 个十和 5 个一,其基数为 10。
    • 二进制(Binary):计算机内部采用的基本数制,只有 0 和 1 两个数字符号,逢二进一。例如,二进制数 101 表示 1 个四(2²)、0 个二(2¹)和 1 个一(2⁰),其基数为 2。
    • 八进制(Octal):采用 0 - 7 八个数字符号,逢八进一,基数为 8。例如,八进制数 37 表示 3 个八(8¹)和 7 个一(8⁰)。
    • 十六进制(Hexadecimal):使用 0 - 9 以及 A - F(分别表示 10 - 15)十六个符号来表示数,逢十六进一,基数为 16。例如,十六进制数 2A 表示 2 个十六(16¹)和 10 个一(16⁰)。
  • 数制转换方法
    • 十进制转二进制:常用的方法是除 2 取余法。例如,将十进制数 13 转换为二进制,过程如下:
      13 ÷ 2 = 6 …… 余 1
      6 ÷ 2 = 3 …… 余 0
      3 ÷ 2 = 1 …… 余 1
      1 ÷ 2 = 0 …… 余 1
      从下往上将余数排列可得二进制数 1101。
    • 二进制转十进制:采用位权展开法。例如,二进制数 1011 转换为十进制,计算为 (1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11)。
    • 二进制与八进制、十六进制的转换:二进制转八进制是每 3 位二进制数对应 1 位八进制数,从右往左分组转换。例如,二进制数 110101 可分为 011 和 0101,对应的八进制数为 35。二进制转十六进制则是每 4 位二进制数对应 1 位十六进制数,同样从右往左分组,如二进制数 1101101 可分为 0110 和 1101,对应的十六进制数为 6D。

1.2 数据的编码表示

  • 原码
    • 原码是一种简单直观的机器数表示法,最高位为符号位(0 表示正数,1 表示负数),其余位表示数值的绝对值。例如,对于 8 位二进制原码,+5 的原码表示为 00000101,-5 的原码表示为 10000101。
    • 原码的优点是简单易懂,缺点是在进行加减法运算时,需要单独处理符号位,运算规则相对复杂,并且会出现 +0 和 -0 有不同表示形式(在 8 位原码中,+0 表示为 00000000,-0 表示为 10000000)等问题。
  • 反码
    • 正数的反码与原码相同,负数的反码是在原码的基础上,除符号位外,其余各位按位取反。例如,8 位二进制中,+5 的反码是 00000101,-5 的反码是 11111010。
    • 反码在一定程度上为后续的补码运算做了铺垫,但同样存在 +0 和 -0 表示不同(+0 反码为 00000000,-0 反码为 11111111)等问题,运算时也不够简洁高效。
  • 补码
    • 正数的补码与原码相同,负数的补码是在其反码的基础上加 1。例如,在 8 位二进制下,+5 的补码是 00000101,-5 的补码是 11111011(先求 -5 的反码 11111010,再加 1 得到补码)。
    • 补码的优势在于可以将减法运算转化为加法运算,简化了计算机的运算电路设计,并且解决了 +0 和 -0 表示不一致的问题(在补码中,+0 和 -0 的补码都是 00000000),是计算机中最常用的有符号数表示方式。
  • 移码
    • 移码常用于表示浮点数的阶码,它是在补码的基础上,将符号位取反得到的。例如,对于 8 位二进制数,若补码为 10000000,则移码为 00000000。
    • 移码的特点是便于比较大小,并且可以直观地反映出数的大小顺序,常用于计算机中对浮点数阶码的处理等场景。

2. 定点数的表示与运算

2.1 定点数的表示

  • 定点整数
    • 小数点固定在数的最右边,即所有数位都表示整数部分。例如,在 8 位二进制定点整数表示中,如果约定最高位为符号位,那么能表示的数值范围是(-(2⁷) )到(2⁷ - 1),即 -128 到 127。
    • 常用在一些只需要处理整数的应用场景中,比如计数器、学号编码等,计算机内部会按照相应的编码规则(如原码、补码等)来存储和处理这些定点整数。
  • 定点小数
    • 小数点固定在符号位之后,也就是最高位是符号位,后面的数位表示小数部分。例如,对于 8 位二进制定点小数,若按补码表示,能表示的数值范围有所不同,其绝对值最大的正数是 (0.1111111)(对应十进制的接近 1 的小数),绝对值最大的负数是(-0.0000001)等。
    • 常用于一些对精度要求不是特别高的小数处理场景,比如一些简单的比例系数、概率值等的表示,在计算机存储和运算时同样遵循既定的编码和运算规则。

2.2 定点数的运算

  • 定点数加法运算
    • 在采用补码表示定点数时,加法运算规则较为简单,只需将两个数的补码直接相加,符号位也参与运算,所得结果的补码就是两数相加的结果。例如,用 8 位补码计算(3 + 5),3 的补码为 00000011,5 的补码为 00000101,两数补码相加得 (00000011 + 00000101 = 00001000),其对应的十进制数就是 8,与实际运算结果相符。
    • 若结果超出了所能表示的数值范围(溢出),则需要进行相应的溢出判断和处理,常见的溢出判断方法有双符号位法(采用两位符号位,正常情况下双符号位相同,若不同则表示溢出)等。
  • 定点数减法运算
    • 利用补码将减法转化为加法来实现,即减去一个数等于加上这个数的补码。例如,计算(5 - 3),相当于 (5 + (-3)),5 的补码是 00000101,-3 的补码是 11111101,两者补码相加 (00000101 + 11111101 = 00000010),得到的结果补码对应的十进制数为 2,符合减法运算结果。
  • 定点数乘法运算
    • 常用的算法有原码乘法和补码乘法等。原码乘法运算时,符号位单独处理,数值部分按绝对值相乘,然后根据符号位确定乘积的符号。例如,用原码计算 (3×5),3 的原码为 00000011,5 的原码为 00000101,数值部分相乘后再结合符号位得到乘积的原码表示。补码乘法相对复杂一些,需要考虑补码的运算规则以及符号扩展等问题,但在计算机中应用更为广泛,以保证运算的一致性和准确性。
  • 定点数除法运算
    • 同样有原码除法和补码除法等不同实现方式。原码除法一般采用恢复余数法或不恢复余数法(加减交替法)等,通过不断比较被除数和除数的大小,进行减法操作以及上商等步骤来求得商和余数。补码除法也需要遵循补码运算的特点来进行相应的运算流程,保证在计算机中能正确地处理除法运算,不过其运算过程和逻辑相对复杂,需要仔细处理符号位、余数等相关问题。

3. 浮点数的表示与运算

3.1 浮点数的表示

  • 浮点数的格式
    • 一般由阶码和尾数两部分组成,采用科学计数法的形式来表示一个数。例如,在 IEEE 754 标准的单精度浮点数(32 位)中,最高位为符号位,接着 8 位表示阶码(采用移码表示且有偏移量),剩下的 23 位表示尾数(采用原码表示,规格化后隐藏最高位的 1)。以浮点数 (1.25)为例,其在 IEEE 754 单精度浮点数中的表示形式经过一系列转换和编码后得到相应的二进制位组合。
    • 不同的浮点数标准在阶码和尾数的位数分配、编码方式等方面会有所不同,但基本原理都是通过这种两部分组合来扩大数的表示范围并兼顾一定的精度要求,常见的还有双精度浮点数(64 位)等,其表示范围更广、精度更高。
  • 浮点数的规格化
    • 为了充分利用尾数的有效位数,提高表示精度,浮点数通常要进行规格化处理。对于二进制浮点数,规格化的形式是尾数最高位为 1(在 IEEE 754 等标准中,规格化后会隐藏这个最高位 1)。例如,将一个非规格化的浮点数通过移位等操作使其变为规格化形式,同时相应地调整阶码的值,保证数的大小不变,这样可以在有限的尾数位数下达到更好的精度表现。
  • 浮点数的表示范围和精度
    • 浮点数的表示范围由阶码的位数决定,阶码位数越多,能表示的数的范围越大。例如,单精度浮点数的阶码 8 位,其能表示的数的范围相对于双精度浮点数(阶码 11 位)要小。而浮点数的精度则主要取决于尾数的位数,尾数位数越多,能表示的小数部分越精确,像双精度浮点数由于尾数有 52 位,在表示一些高精度的小数数值时比单精度浮点数更准确。

3.2 浮点数的运算

  • 浮点数加法运算
    • 首先要对参与运算的两个浮点数进行对阶操作,使它们的阶码相等,这通常是通过将阶码小的数的尾数右移,同时增大其阶码,直到两个数的阶码相同为止。然后进行尾数相加,得到新的尾数,再根据结果对其进行规格化处理,并调整阶码,最后确定符号位,得到运算后的浮点数结果。例如,计算两个单精度浮点数的加法,要按照上述步骤依次进行操作,整个过程涉及到多个环节的细致处理,以保证运算的准确性和符合浮点数的表示规则。
  • 浮点数减法运算
    • 类似于加法运算,先进行对阶,然后将两个浮点数的尾数相减,再进行规格化、调整阶码以及确定符号位等操作,同样需要注意对阶过程中的精度损失、尾数运算后的溢出等问题,确保得到正确的减法运算结果。
  • 浮点数乘法运算
    • 分别对两个浮点数的阶码和尾数进行相应运算,阶码相乘(在实际运算中按相应规则处理,比如通过移码运算等方式),尾数相乘(按照定点数乘法规则进行),然后对乘积的结果进行规格化处理,调整阶码,得到最终的浮点数乘积。整个过程需要综合考虑各部分的运算以及浮点数表示的规范要求,保证乘法运算在浮点数体系下的正确执行。
  • 浮点数除法运算
    • 先进行阶码相减,然后尾数相除(运用定点数除法运算方法),再对商进行规格化处理,调整阶码以及确定符号位等,由于除法运算可能会涉及到除数为 0 等特殊情况以及尾数相除后的精度控制等问题,所以在计算机实现浮点数除法时需要进行严谨的错误处理和精度保障机制。

4. 数据运算中的溢出与检测

4.1 溢出的概念

  • 溢出是指在计算机进行数据运算时,运算结果超出了数据所能表示的范围的情况。例如,在 8 位二进制补码表示的定点整数运算中,能表示的范围是 -128 到 127,如果运算结果超出这个范围,就发生了溢出。溢出会导致运算结果错误,所以计算机需要有相应的机制来检测和处理溢出情况。

4.2 溢出的检测方法

  • 双符号位法(变形补码法)
    • 采用两位符号位来表示一个数,正数的双符号位为 00,负数的双符号位为 11。在进行运算时,符号位也参与运算,如果运算结果的双符号位出现 01 或 10 的情况,就表示发生了溢出。例如,用双符号位法进行定点数加法运算时,通过观察运算后结果的双符号位状态来判断是否溢出,这种方法直观且能准确检测出溢出情况,常用于计算机内部对定点数运算溢出的判断。
  • 单符号位法结合进位判断
    • 通过观察最高位(符号位)的进位情况以及次高位向最高位的进位情况来判断溢出。若最高位进位和次高位进位不同,则表示发生了溢出。例如,在进行加法运算时,对每一位的进位情况进行记录和分析,根据上述规则来确定是否有溢出发生,这种方法相对简单,在一些简单的运算场景中也能有效地检测溢出问题。

4.3 溢出的处理

  • 截断处理
    • 当发生溢出时,如果是定点数运算,一种简单的处理方式是截断超出范围的部分,只保留能表示的范围内的数据,但这样会导致结果不准确,只是在某些对精度要求不高的情况下可以采用这种临时的处理办法。例如,对于一些简单的计数器应用,若溢出后截断多余部分,可能只是使得计数出现一个相对小的偏差,对整体功能影响不大。
  • 采用更大的数据类型或扩展表示范围
    • 如果允许的话,可以将参与运算的数据类型转换为能表示更大范围的类型,比如从 8 位定点整数转换为 16 位定点整数,或者采用浮点数来表示数据,以避免溢出情况的发生,这种方法在需要高精度和大范围数据运算的场景中较为常用,不过会增加存储和运算的资源消耗等成本。

5. 数据运算的硬件实现

5.1 算术逻辑单元(ALU)

  • ALU的功能与结构
    • ALU是计算机中执行算术运算(如加法、减法、乘法、除法等)和逻辑运算(如与、或、非、异或等)的核心部件。它通常由加法器、逻辑门等基本电路组成,加法器是实现加法运算的基础,通过组合逻辑电路的设计可以在其基础上扩展实现其他算术运算,逻辑门(与门、或门、非门等)则用于实现各种逻辑运算功能。例如,一个简单的 4 位 ALU 可以对 4 位二进制数进行相应的算术和逻辑运算操作,并且通过控制信号来选择具体执行哪种运算。
    • ALU在计算机运算过程中接收来自寄存器等部件的数据输入,运算完成后将结果输出到相应的寄存器或者其他存储部件,与计算机的控制器、寄存器组等协同工作,完成各种复杂的数据处理任务。
  • ALU的运算速度与性能影响因素
    • ALU的运算速度主要取决于其内部电路的设计、采用的工艺技术以及数据的位数等因素。例如,采用更先进的半导体制造工艺可以减小电路的延迟,提高运算速度;增加 ALU 的数据位数可以处理更大范围的数据,但同时也可能会增加电路的复杂度和延迟。

5.2 加法器

  • 半加器(Half Adder)
    • 功能与原理:半加器是实现一位二进制数相加的基本电路,它有两个输入,分别为被加数 (A) 和加数 (B),以及两个输出,分别是和 (S) 与进位 (C)。其运算逻辑遵循二进制加法规则,即 (S = A \oplus B)(这里 (\oplus) 表示异或运算), (C = A \cdot B)(这里“(\cdot)”表示与运算)。例如,当 (A = 0),(B = 1) 时,通过异或运算可得 (S = 1),通过与运算可得 (C = 0),也就是实现了 (0 + 1 = 1) 且无进位的运算。
    • 应用场景及局限:半加器只能处理本位的两个二进制数相加,不考虑来自低位的进位情况,所以它常用于组成更复杂的加法器电路的基础部件,在一些简单的一位数运算场景或者构建多位加法器的底层模块中发挥作用,但单独使用无法完成多位二进制数完整的加法运算。
  • 全加器(Full Adder)
    • 功能与原理:全加器在半加器的基础上进行了扩展,它有三个输入,分别是被加数 (A)、加数 (B) 以及来自低位的进位 (C_{in}),同样有两个输出,即和 (S) 与向高位的进位 (C_{out})。其运算逻辑为 (S = A \oplus B \oplus C_{in}), (C_{out} = (A \cdot B) + (A \cdot C_{in}) + (B \cdot C_{in}))。比如,当 (A = 1),(B = 1),(C_{in} = 1) 时,按照上述公式计算可得 (S = 1), (C_{out} = 1),实现了三位二进制数相加并正确处理进位的功能。
    • 应用场景及优势:全加器能够处理包含低位进位的加法运算,是构建多位二进制加法器的关键组成部分。通过将多个全加器级联起来,就可以实现对多位二进制数的加法运算,例如,使用 4 个全加器可以组成一个 4 位二进制加法器,依次将低位全加器的进位输出连接到高位全加器的进位输入,从而完成如 (1101 + 1011) 这样的 4 位二进制数加法操作。

5.3 乘法器

  • 串行乘法器(Serial Multiplier)
    • 工作原理:串行乘法器是按照顺序逐位进行乘法运算的硬件电路。它基于移位和加法操作来实现乘法功能。以两个 4 位二进制数 (A = a_{3}a_{2}a_{1}a_{0}) 和 (B = b_{3}b_{2}b_{1}b_{0}) 的乘法为例,首先将乘数 (B) 的最低位 (b_{0}) 与被乘数 (A) 进行乘法(实际就是根据 (b_{0}) 的值决定是否将 (A) 累加到结果中,若 (b_{0} = 1) 则累加,若 (b_{0} = 0) 则不累加),然后将 (A) 左移一位,再取 (B) 的下一位 (b_{1}) 重复上述操作,依次类推,经过 4 个时钟周期(对于 4 位乘法),最终得到乘积结果。
    • 优缺点:优点是硬件结构相对简单,占用的硬件资源较少;缺点是运算速度较慢,因为它是逐位进行运算的,对于位数较多的二进制数乘法,需要较长的运算时间,例如在进行 16 位二进制数乘法时,就需要经过 16 个时钟周期才能完成运算,所以适用于对运算速度要求不高、资源有限的简单应用场景。
  • 并行乘法器(Parallel Multiplier)
    • 工作原理:并行乘法器采用并行处理的方式来进行乘法运算,它通过多个加法器和逻辑电路同时对不同位的数据进行处理,以加快运算速度。常见的实现方式如阵列乘法器,它以矩阵形式排列多个全加器和与门等基本电路元件,对于两个 (n) 位二进制数相乘,能在较短的时间内(一般只需几个时钟周期,与具体的电路设计有关)同时完成各位之间的乘法和加法操作,快速得出乘积结果。例如,对于 4 位的并行乘法器,通过合理的电路布局和各元件协同工作,能快速完成两个 4 位二进制数的乘法运算。
    • 优缺点:优点是运算速度快,能在短时间内处理较大位数的二进制数乘法,适用于对运算速度要求较高的场合,比如高性能计算机的运算单元等;缺点是硬件结构复杂,需要大量的逻辑门和加法器等元件,导致硬件成本增加,占用芯片面积较大,功耗也相对较高。

5.4 除法器

  • 恢复余数除法器(Restoring Divider)
    • 工作原理:恢复余数除法器基于比较和减法操作来实现除法运算。首先将被除数放入寄存器中,除数也存放在相应寄存器,然后不断重复以下步骤:将被除数(或当前余数)与除数进行比较,如果被除数(或余数)大于等于除数,则做减法操作(用被除数或余数减去除数),商上 1;如果被除数(或余数)小于除数,则商上 0,然后将被除数(或余数)左移一位(相当于乘以 2),再重复上述比较和减法操作,直到达到规定的运算次数或者满足特定的结束条件(如得到了所需精度的商和余数)。例如,用恢复余数除法器计算 (10 \div 3)(这里以简单的十进制示例说明原理,实际在计算机中是二进制运算),先比较 (10) 和 (3), (10\geq 3),做减法 (10 - 3 = 7),商上 (1),然后将 (7) 左移一位变为 (14),再继续比较 (14) 和 (3) 等操作,逐步得到商和余数。
    • 优缺点:优点是原理相对直观易懂,容易实现;缺点是运算过程中需要进行恢复余数的操作(当某次比较发现被除数或余数小于除数时,需要将之前减去的除数再加回来,恢复原来的余数状态),这增加了运算的时间和硬件实现的复杂度,导致运算效率不是很高,一般在一些对运算速度要求不特别高的简单计算机系统中可能会采用。
  • 不恢复余数除法器(Non-Restoring Divider,也叫加减交替法除法器)
    • 工作原理:不恢复余数除法器改进了恢复余数除法器的运算过程,它在每次比较后,根据比较结果决定是做减法还是加法操作,并且后续的操作不需要像恢复余数除法器那样进行余数恢复的步骤。具体来说,若当前余数大于等于除数,则做减法且商上 (1);若当前余数小于除数,则做加法且商上 (0),然后将余数左移一位后继续下一轮比较和相应的加减操作,如此循环,直至达到运算要求。例如,同样计算 (10 \div 3) 时,按照不恢复余数的规则进行操作,在比较判断和相应的加减、移位以及上商等步骤下,更高效地得到商和余数,减少了额外的恢复操作带来的时间和硬件开销。
    • 优缺点:优点是运算效率相对较高,减少了不必要的余数恢复步骤,加快了除法运算速度,在计算机的硬件除法实现中应用更为广泛;缺点是其运算逻辑相对恢复余数除法器稍复杂一些,对硬件设计的要求也更高一点,不过在权衡运算速度和硬件成本等因素后,在大多数现代计算机系统中还是更倾向于采用这种除法器实现方式。

5.5 运算器的组织与控制

  • 运算器的内部组织
    • 部件连接与协同工作:运算器内部各部件(如 ALU、加法器、乘法器、除法器以及相关寄存器等)通过数据总线、控制总线等进行连接。例如,寄存器用于暂存参与运算的数据以及运算过程中的中间结果和最终结果,它们与 ALU 通过数据总线相连,以便能将数据传输给 ALU 进行运算;控制总线则传输控制信号,用于选择 ALU 要执行的具体运算(是加法、减法还是其他运算)以及协调各部件之间的工作顺序等。以一个简单的 8 位运算器为例,其内部的两个通用寄存器 (R1) 和 (R2),当需要进行加法运算时,通过控制信号使得 (R1) 和 (R2) 中的数据通过数据总线传输到 ALU,ALU 按照加法运算规则进行操作后,再将结果通过数据总线送回指定的寄存器(如结果寄存器 (R3))中保存起来。
    • 数据通路设计:数据通路描述了数据在运算器内部以及与其他相关部件(如存储器、控制器等)之间流动的路径和方式。合理的数据通路设计能够提高运算效率,减少数据传输延迟。例如,采用并行的数据通路可以使多个数据同时传输和处理,像在一些高性能运算器中,设置多条独立的数据总线,使得不同的数据可以并行地在加法器、乘法器等不同运算部件之间传递,加快运算速度;而在一些简单运算器中,可能采用较为简单的串行数据通路,以降低硬件成本,但相应地运算速度会稍慢一些。
  • 运算器的控制机制
    • 指令译码与控制信号生成:运算器的工作受控制器发出的控制信号的支配。当计算机执行一条指令时,指令首先被送到控制器进行译码,控制器根据指令的操作码(如表示加法的操作码、表示乘法的操作码等)以及寻址方式等信息,生成相应的控制信号并发送给运算器。例如,若指令的操作码对应的是乘法运算,控制器就会生成一组控制信号,这些信号会作用于运算器内部的乘法器部件,使其启动并按照规定的方式(如并行乘法还是串行乘法等)进行乘法运算,同时协调相关寄存器的数据传输等操作。
    • 时序控制与操作顺序:运算器的操作还需要遵循一定的时序要求,即在不同的时钟周期完成相应的操作步骤。例如,在进行一个多步的乘法运算时,第一个时钟周期可能用于将乘数和被乘数从寄存器加载到乘法器的输入端口,第二个时钟周期进行乘法运算的核心操作,第三个时钟周期将结果传输到结果寄存器等,通过精确的时序控制,保证运算的正确进行以及各部件之间的协调配合,使得整个运算过程有条不紊地完成。

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guiat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值