计组-数据的表示和运算(2)

计组-数据的表示和运算(2)
4FGR2.1 数制与编码
进位计数制
基数:每个数码位所用到的不同符号的个数,$k$ 进制的基数为 $k$
$$
k进制: a_na_{n-1}…a_{2}a_1a_0…
\
=a_nk^n+a_{n-1}k^{n-1}+…+a_2k^2+a_1k+a_0+…
$$
其中 $k$ 的次幂称之为 位权 。
二进制转八进制或者十六进制,只要按3、4位一组转换即可。

整数:除基取余法,比如模2的结果是整数的低位
小数点:乘基取余法,比如乘2的整数是小数的高位
真值与机器数
- 真值:实际的带正负号的数
- 机器数:把正负号数字化的数
定点数的编码表示
- 无符号数
- 有符号数
- 原码 / 反码 / 补码 / 移码
若真值为 $x$ ,则用 $[x]_{原}$ 表示原码,其它同理。

反码:若符号位为 $1$ ,数值位全部取反。是补码的中间状态
补码:正数的补码=原码,负数的补码=反码末位+1
规定定点整数补码 $[x]_{补}=1,000…=-2^k$
小数 $[x]_{补}=1.000…=-1$
移码:在补码的基础上将符号位取反。只能用于表示整数
移码表示的整数很方便比大小
$0,000\cdots0 (-2^k)\rightarrow 1,111\cdots1(2^k-1)$
技巧:由 $[x]{补}$ 快速求 $[-x]{补}$
符号位、数值位全部取反,末位$+1$
补码的作用:
使用补码可将减法操作转变位等价的加法,ALU中无需集成减法器。执行加法操作时,符号位一起参与运算。
a-b减法操作等同 模-$|b|$ 得到 $b$ 的补数,
$$
a-b \equiv a-b+p \pmod p
$$
即计算 $2^k-b$ 即可,实际上就是对应的补码,超出部分会自动舍弃
C语言强制类型转换
C语言中的定点整数是用 “补码” 存储的。
长整数变短整数,高位截断,保留低位
零扩展、符号扩展
需要扩展的情形:
- ALU 的位数时固定的,运算前可能需要把端数据扩展为长数据。
- 通用寄存器位数是固定的,把数据存入寄存器时,可能需要进行长度扩展。
- 主存内的各种数据长度不一
对无符号数(补码),使用零扩展为高位补零。
对带符号整数(补码),使用符号扩展,符号位不变,用符号位扩展高位。
2.2 运算方法和运算电路
基本逻辑运算
与、或、非、异或

优先级:非>与>或
逻辑运算公式
分配律 $A(C+D)=AC+AD$
与运算的结合律 $ABC=A(BC)$
或运算的结合律 $A+B+C=A+(B+C)$
反演律(德摩根律):
$$
\begin{align}
\overline{A+B}&=\overline{A}\cdot\overline{B}\
\overline{A\cdot B}&=\overline{A}+\overline{B}
\end{align}
$$
多路选择器(MUX)
在多个输入数据中,只允许其中一个数据通过MUX。
若有 $k$ 个输入,则控制信号的位数 $m\geq \lceil \log_2{k}\rceil$ bit
三态门
控制信号通常只需要 1bit 。$op=1$ 表示允许数据通过;$op=0$ 表示不允许数据通过。
加法器
一位、串行进位、并行进位加法器

多个一位全加器(FA)串行相连得到 n bit 加法器。
不足之处:进位信息是串行产生的,计算速度取决于进位产生和传递的速度。
由于两个输入端允许并行输入,因此属于:并行加法器
由于进位信息是串行产生的,因此也属于:串行进位加法器
也可称为,串行进位的并行加法器。
因此,还有并行进位的并行加法器,其所有进位信息都是同时产生的,几乎没有延迟,比串行进位的并行加法器更快。
带标志位的加法器
OF (Overflow Flag) 溢出标志,用于判断带符号数加减运算是否溢出。也用于判断数的乘法运算是否溢出。
OF = 1 溢出; OF = 0 未溢出
SF (Sign Flag) 符号标志,用于判断带符号数加减运算结果的正负性
SF = 1 负; SF = 0 正
ZF (Zero Flag) 零标志,用于判断加减运算结果是否为 $0$ 。
ZF = 1 表示结果为 0 ,ZF = 0 则不为 0
CF (Carry Flag) 进位/借位标志,用于判断无符号数加减运算是否溢出。
CF = 1溢出,CF = 0 未溢出。
标志位的生成

算术逻辑单元ALU
ALU: Arithmetic and Logic Unit
ALU是运算器的核心,ALU的核心是加法器。
- 算术运算
- 逻辑运算
- 其它:求补码、直送等。
直送,直接送出
考试重点
- 如果 ALU 支持 $k$ 种功能,则控制信号位数 $m\geq \lceil \log_2k\rceil$
- ALU的运算数、运算结果位数与计算机的机器字长相同
定点数的移位运算
逻辑移位(常用于处理无符号整数)
- 逻辑左移:高位移出丢弃,低位补 0
对于无符号整数,每逻辑左移一位,则相当于 $\times 2$
- 逻辑右移:低位移出丢弃,高位补 0
相当于 $\div2$ 且向下取整
算术移位(常用于处理带符号整数)
- 算术左移:高位溢出丢弃,低位补 $0$
左移后符号位不同,说明发生溢出
- 算术右移:低位移出丢弃,高位补符号位
定点数的加减运算
原码的加减运算(了解即可)

补码的加减运算

溢出判断
两个正数相加,可能发生上溢
两个负数相加,可能发生下溢
方法一
采用单符号位,对于 $[A+B]_{补}$ ,设其符号位为 $A_S,B_S$ ,运算结果的符号为 $S_S$ ,则判断
$$
V=A_SB_S\overline {S_S} + \overline {A_S};\overline{B_S} S_S
$$
若 $V$ 为 $0$ 表示无溢出,为 $1$ 表示有溢出。
方法二
采用单符号位,判断溢出符号位的进位 $C_S$ ,最高数值位的进位 $C_1$
当 $C_S$ 和 $C_1$ 不同时有溢出
$$
V=C_S\oplus C_1
$$
Eg. 两个负数的符号位分别为 $1$ ,因此 $C_S=1$ (会被舍去),如果最高值位没有进 $1$ ,说明机器数为正数,显然发生了溢出。
方法三
采用双符号位,正数为 $00$ ,负数为 $11$ ,如果出现 $01$ ,说明发生了上溢,如果出现 $10$ ,说明发生了下溢。
实际存储时只存储一个符号位,运算时会复制一个符号位
单符号位是模2补码,双符号位是模4补码
无符号数的加减运算
加法:从最低位开始,按位相加并进位
减法:
- “被减数不变”,”减数”全部位为按位取反、末尾+1($2^k-a$),减法变加法
判断溢出
手算:判断数是否超过 $0\sim 2^n-1$
计算机判断溢出的方法:
- 加法:最高位产生的进位 $=1$ 时,溢出
- 减法:最高位产生的的进位 $=0$ 时(被$2^k$取模),说明发生溢出
补码加减运算电路

无符号整数加减运算也可使用该电路实现
乘法除法运算
无符号整数的乘法运算原理
开始:
- 将被乘数、乘数分别放入寄存器 X、Y
- 乘积寄存器P 置为 0
- 计数器 $C_n$ 的初始值置为 n (n 为乘数的位数)

带符号整数的乘法运算原理
手算时,直接用十进制算即可。

本节的“补码一位乘法”,又被称为 布斯(Booth)乘法
计算机实现乘法运算的三种方式
改成两位乘法,每次处理 $2bit$
阵列乘法器
- 可以在一个时钟内完成乘法运算
- 是快速乘法器的一种
如果在软件上用逻辑运算、加减运算等效实现乘法,好处是可以在没有乘法运算电路、不支持乘法指令的计算机种使用,但运算速度很慢。
无符号整数的除法运算原理
无符号整数除法的手算方法
二进制上商规则: 如果中间余数 $\leq$ 除数,则上商 $1$ ,否则上商 $0$ 。

带符号整数(补码)的除法运算原理

2.3 浮点数的表示与运算
浮点数的表示
浮点数的表示__IEEE754
这里采用IEEE754标准
规格化:确保位数的最高位非 0 数位刚好在小数点之前
C语言float型:
符号位 1bit,阶码 8bit,尾数 23bit
符号:0 正 1 负
尾数:影响数值的精度,规定小数点位置在23bit之前。默认存储规格化尾数,小数点前的 1 省略(隐含)
阶码:反映小数点的实际位置,用移码表示,规定偏置值位 127($2^8-1$)
基数:规定基数为 2,无需存储
将十进制真值转换为偏置值为M的移码:
将十进制真值+偏置值
按“无符号整数”规则转换为指定位数
C语言double型:
符号位 1bit,阶码 11bit,尾数 52bit
偏置值为 1023($2^{11}-1$)
浮点数表示范围、几种特殊状态
IEEE 754标准规定:仅当阶码不全为0、也不全为1时,表示这是一个“规格化浮点数”,阶码全为0、全为1 留作特殊用途。

单精度浮点数的阶码的真值取值范围为 $-126 \sim 127$ (去掉全0的-127与全1的128)


绝对值最小的 float 非规格化负数:
$-1.0\times 2^{-149}$ $1,00000000,00..001$
绝对值最小的 float 非规格化正数:
$+1.0\times 2^{-149}$ $0,00000000,00..001$
浮点数的加减运算

浮点数的“上溢”

同理,发生下溢时,阶码为全1,强制尾数置为全0。
数据的存储与排列
大小端模式

边界对齐






