计算机组成原理【2】: 数据的表示和运算-上

概述


数制与编码

  • 进位计数制及其相互转换;定点数的编码表示

运算方法和运算电路

  • 基本运算部件:加法器;算术逻辑单元(ALU)
  • 加减运算:补码加/减运算器;标志位的生成
  • 乘/除运算:乘/除法运算的基本原理;乘法电路和除法电路的基本结构

数制与编码

进位计数制及其相互转换


采用二进制编码的原因

  1. 二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位,制造成本比较低。
  2. 二进制位1和0正好与逻辑值"真"和"假"相对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件。
  3. 二进制编码和运算规则都很简单,通过逻辑门电路能方便地实现算术运算。

进位计数法

  1. 计算机通常使用二进制数八进制数十六进制数

  2. 进位计数法中,每个数位所用到的不同数码的个数称为基数 。每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数,这个常数称为位权

  3. 一个r进制数$ K_nK_{n-1}\dots K_0K_{-1}\dots K_{-m}$的数值可以表示为:

\[K_nr^n+K_{n-1}r^{n-1}+\cdots+K_0r^0+K_{-1}r^{-1}+\cdots+K_{im}r^{-m}=\sum^{-m}_{i=n}K_ir^i \]

  1. 可以用后缀字母标识一个数的进位计数制,用B表示二进制,用O表示八进制,用D表示十进制(通常省略),用H表示十六进制,有时也用前缀0x表示十六进制数。
C++ 复制代码
109=109D=1101101B=155O=5CH=0x5C

进制转换

将十进制数123.6875转换成二进制数

  • 整数部分采用除基取余法

  • 小数部分采用乘基取整法

定点数的编码表示


真值和机器数

  1. 真值:数据在逻辑上或数学上的实际值。
  2. 机器数:计算机内部存储和处理的数值。

机器数的定点表示

  1. 根据小数点的位置是否固定,将数据格式区分为:定点表示浮点表示
  2. 浮点表示:用补码整数表示整数,用原码小数表示浮点数的尾数部分,用移码表示浮点数的阶码部分。
  3. 定点小数:定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。
  4. 浮点小数:定点整数是纯整数,约定小数点位置在有效数值部分最低位之后。
  5. 定点数的编码表示法有四种:原码、补码、反码和移码。

原码

用机器数的最高位表示数的符号,其余各位表示数的绝对值。

C++ 复制代码
+0111->0 0000111
-1011->1 0001011

反码

正数的反码与原码相同,对于负数的反码,符号位保持不变,而数值位则按位取反。

C++ 复制代码
+1011->0 0001011
-1011->1 1110100

补码

正数的补码和原码相同,负数的补码等于模\(2^{n+1}\)与绝对值之差,其中n为尾数位数。

也可以采用"各位取反,末位+1"的方法得到

C++ 复制代码
机器数BAH为补码,其表示的数值为多少?
BAH = 1011 1010B
符号:-
数值:011 1010-1=011 1001--取反--> 100 0110 = 70
故表示-70

移码

移码场用来表示浮点数的阶码。移码是在真值\(X\)上加上一个常数(偏置值),通常这个常数取\(2^n\)

C++ 复制代码
+1011 -> 10001011
-1011 -> 01110101

同一个数的反码、移码的数值位相同,符号位相反

无符号整数

当一个编码的全部二进制位均为数值位,而没有符号位时,该编码表示就是无符号整数,简称无符号数

C语言中的整数类型及类型转换


C语言规定了如下类型:

  • 字符型char:8位/1字节
  • 短整型short: 16位/2字节
  • 整型int:32位/4字节
  • 长整型long:在32位机器中为32位,64位机器中为64位

char默认是无符号整数,short/int/double默认是有符合整数

强制类型转换

在有符号整型和无符号整型的强制类型转换时,位值保持不变,仅改变了解释值的方式。

不同字长整数之间的转换

长->短 :当长字长变量向短字长变量强制类型转换时,数值位的高位部分直接截断。
短->长:当短字长变量向长字长变量强制类型转换时,数值位的高位部分补0。

运算方法和运算电路

基本运算部件


基本运算部件

  1. 运算器组成:运算器由算术逻辑单元(ALU)移位器状态寄存器(PSW)通用寄存器等组成。
  2. 运算器的基本功能包括四则运算、逻辑运算、移位、求补等。
  3. ALU的核心部件是加法器。

全加器及其工作原理

全加器 :全加器是一种用于二进制加法的基本电路元件。它的主要功能是对两个二进制数位以及一个进位输入进行加法运算。

全加器有三个输入:A加数、B加数、C来自前一位的进位输入。

全加器有两个输出:F和,加法结果的当前位;Cout进位输出,向下一位进位的值。

全加器输入和输出逻辑关系如下:

  • F和 :\(F=A\oplus B \oplus C_{in}\)

简单理解:保留计算结果的最低位。

1+1+0=10 -> F=0

  • Cout进位输出 :\(C_{out}=(A\land B)\lor(A\land C_{in})\lor(B\land C_{in})\)

简单理解:A、B、Cin只要有任意两个是1,则Cout为1。

A=1, B=1, Cin=1 -> Cout=1

带标志加法器

为了能进行有符号整数的加/减运算,需要在无符号加法器的基础上增加相应的逻辑门电路,使得加法器不仅能计算和/差,还要能生成相应的标志信息。

图:带标志加法器符号

标志信息的逻辑表达式如下:

  • 溢出标志OF:\(OF=C_n \oplus C_{n-1}\)
  • 符号标志SF:\(SF=F_{n-1}\)
  • 零标志ZF:\(ZF=0\)当且仅当\(F=0\)
  • 进位/借位标志CF:\(CF=C_{out}\oplus C_{in}\)

图:带标志加法器的逻辑电路

算术逻辑单元(ALU)

ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。由于加、减、乘、除运算都能归结为加法运算,因此ALU的核心是带标志加法器。

ALUop是操作控制端,用来决定ALU所执行的处理功能。ALUop的位数决定了操作的种类。

在ALUop的控制下,由一个多路选择器(MUX)选择输出三种操作结果之一。

图:一位ALU的结构

定点数的移位运算


根据操作数的类型不同,移位运算可以分为逻辑移位和算术移位

逻辑移位

  • 逻辑移位将操作数视为无符号整数。

  • 规则:左移 时,高位移出,低位补0;右移时,低位移出,高位补0。

    左移:1011->0110
    右移:1011->0101

位移如何判断是否有溢出?

左移:左移前后符号位相同则没有溢出,反之有溢出;

右移:右移不会发生溢出。

算术移位

计算机中的有符号整数都是用补码表示的,因此对于有符号整数的移位操作应采用补码算术移位方式。
左移 :数值位最高位移至符号位,其余为左移,最低位补零。
右移 :数值位右移,最高位补符号位。

定点数的加减运算


补码的加减法运算

补码运算规则如下:

  1. 按二进制运算规则运算。
  2. 若做加法 ,两个数的补码直接相加;若做减法,则将被减数与减数的负数补码相加。
  3. 符号位与数值位一起参与运算,加、减运算结果的符号位也在运算结果中直接得出
  4. 运算结果亦为补码。

    图:补码加减法运算示意

溢出判别方式

设\(A\)的符号是\(A_S\),B的符号是\(B_S\),运算结果的符号是\(S_S\),则溢出逻辑表达式是:

\[V=A_SB_S\overline{S_S}+\overline{A_S}\overline{B_S}S_S \]

若V=0,表示无溢出;若V=1表示有溢出。

有两种溢出情况:输入均正输出为负;输入均负输出正。

加减运算电路设计

分析下图的运算组件。

当Sub为0时,加法器计算\(X+Y\)。

当Sub为1时,加法器计算\(X+\overline{Y}+1\),相当于计算\(X-Y\)。

定点数的乘除运算


原码乘法

原码乘法运算分为两步:

  1. 符号:乘积的符号位由两个乘数的符号位"异或"得到。
  2. 数值:乘积的数值位是两个乘数的绝对值之积。

乘法运算电路

这里讨论32位无符号数乘法,其流程如下:

  1. 乘积寄存器初始置0。
  2. 将被乘数放在乘数寄存器X中,乘数存放在乘积寄存器Y中。
  3. 计数器\(C_n\)赋初值32,每循环一次减1。
  4. 对进位位C、寄存器P和寄存器Y实现同步"逻辑右移",此时进位位C移入寄存器P的最高位,寄存器Y的最低位移出。
  5. 将乘积寄存器Y移出的最低位送至控制逻辑,以决定被乘数是否"加"到部分积上。
  6. 对乘积寄存器P和被乘数寄存器X的内容做无符号加法运算,结果送回寄存器P,进位存放在C中。
    7.. 跳转至3.

图:32位无符号数乘法的运算的逻辑结构图

为便于理解,以8位无符号数为例:

C++ 复制代码
计算 1101 0111 * 0010 1101

1 置零Cn=0,C=0,P|Y = 0000 0000 0000 0000,X = 0000 0000
2 输入Cn=0,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
3 初始化Cn=8,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
4 右移P|Y = 0000 0000 0001 0110,移出1
5 移出为1,故做加法
6 P=0000 0000 X =1101 0111,结果F=1101 0111,C=0
  P|Y = 1101 0111 0001 0110
3 Cn=7
4 右移P|Y = 0110 1011 1000 1011,移出0
5 移出为0,不做加法,跳过⑥
3 Cn = 6
4 右移P|Y = 0011 0101 1100 0101,移出1
5 移出为1,做加法
6 P=0011 0101 X=1101 0111,结果F=0000 1100,C=1
  P|Y  = 0000 1100 0001 0110
3 Cn = 5
4 右移 P|Y = 1000 0110 0000 1011,移出0
...

除法运算

除法运算的过程可归纳为:

  1. 被除数与除数相减,够减则上商1,不够减则上商0。
  2. 差为中间余数,将除数右移继续比较。

除法运算电路

  1. 将除数存在寄存器Y中
  2. 将被除数的高32位存在寄存器R中;将被除数的低32位存在寄存器Q中
  3. 计数器\(C_n\)赋初值32,每循环一次减1
  4. ALU对寄存器R和寄存器Y内容做加/减法运算,运算结果送回寄存器R
  5. 对寄存器R、Q同步左移,Q最高位移入R的最低位,Q空出的最低位被上商
  6. 控制逻辑根据ALU运算结果的符号来决定上商是0还是1

32位int整数相除只有 \(-2^{31}/-1\)会溢出

下篇预告

下篇我们将分享整数的表示和运算浮点数的表示和运算两个板块的知识点。

制作不意,请帮我点一个免费的赞,谢谢!