进位计数制


基数 R：允许使用的基本数码个数

 权 Wi：权也称位权，第 i 位上的数码的权重

值，即权与数码所处的位置 i 有关

$W_i=R$

**假设任意数值N用R进制数来表示：**

$N= (D{m-1}D{m-2}...D_0 . D_{-1}D{-2}...D{-k}）_R$ 

 Di：基本符号， 

$\mathsf { D } _ { \mathsf { i } } \in [ \mathsf { 0 } ,$ R-1],i=-k,-k+1, .….，m-1；小数点在$D_0$和$D_{-1}$之间

数值N的实际值为：加权求和

 十进制:$N=\Sigma_{i=-k}^{m-1}(D_i \times R^i)$

X 何谓十进制、二进制、八进制、十六进制？

<table><tr><td>进制</td><td>基数R</td><td>权Wi</td><td>数码符号</td></tr><tr><td>十进制</td><td>R=10</td><td>10^i</td><td>0~9</td></tr><tr><td>二进制</td><td>R=2</td><td>2^i</td><td>0、1</td></tr><tr><td>八进制</td><td>R=8</td><td>8^i</td><td>0~7</td></tr><tr><td>十六进制</td><td>R=16</td><td>16^i</td><td>0~9、A~F</td></tr></table>

二进制$\rightarrow$八进制

 以小数点为中心分别向两边分组，每三位一组，写出对应的八进制数字（不够位数则在两边加0补足3位 ）  
 二进制$\rightarrow$ 十六进制  
 以小数点为中心分别向两边分组，每四位一组，写出对应的十六进制符号（不够位数则在两边加0补足4位 ）  
 八进制$\rightarrow$ 二进制  
 将每位八进制数展开为3位二进制数，整数的最高位0和小数的最低位0可以略去  
 十六进制 $\rightarrow$二进制  
 将每位十六进制数展开为4位二进制数，整数的最高位0和小数的最低位0可以略去



如何在计算机内使用二进制来表示十进制数据？

十进制数的编码

BCD（Binary Coded Decimal）码：  
 使用二进制来编码十进制数字 $\pmb { 0 } \sim \pmb { 9 }$   
编码方法：  
 一般使用 4 位二进制编码来表示 1 位十进制数字  
 在 16 个编码中选用 10 个来表示数字 $\pmb { 0 } \sim \pmb { 9 }$   
 不同的选择构成不同的 BCD 码  
分类：  
 有权码：编码的每一位都有固定的权值，加权求和的值即是表示的十进制数字。如 8421 码、2421 码、5211 码、4311 码、84 -2-1 码等  
 无权码：编码的每一位并没有固定的权，主要包括格雷码、余 3 码等

十进制数串的表示方法

数值数据：用于表示数的大小，其值确定，可与数轴上确切的点对应

 非数值数据：没有值大小的概念，表示字符、汉字、图像、声音等信息  
 计算机中如何表示数值数据？数值数据的格式要素，必须要考虑三点

 第一，符号如何表示？  
 第二，小数点如何表示？  
 第三，二进制数字如何排列来表示某个数值？  
 机器数：数值数据在计算机中的二进制表示形式。  
 机器数的符号位必须被数值化为二进制 0 和 1  
 机器数的小数点用隐含规定的方式来表达  
 表示的数值范围受计算机字长的限制  
 编码方法：不同的排列方式，常见的有原码、反码、补码、移码。  
 真值：机器数真正表示的数值数据  
 书写： $+ /$ －符号 数值（二进制或十进制）

计算机中参与运算的数值数据有两种：

 无符号数据（Unsigned ）：所有的二进制数据位数均用来表示数值本身，没有正负之分

 带符号数据（Signed）：则其二进制数据位，包括符号位和数值位  
 当机器字长相同时，无符号数和有符号数的表示范围是不同的  
计算机中：小数点的表示方法？  
 计算机中没有专用的部件用来表示小数点  
 机器数中，小数点及其位置是隐含规定的  
 有两种隐含方式：定点和浮点

定点机器数（Fixed Point）：小数点的位置是固定不变的，两种位置：

 定点小数：纯小数，隐含固定在符号位Xs（最高位）之后，整数位是符号位  
 定点整数：纯整数，小数点隐含固定在最低位之后，最高位为符号位Xs



| 符号位 | 小数点隐含位置 | 数值位    |
| ------ | -------------- | --------- |
| X_s    | .              | X1X2...Xn |



| 符号位 | 数值位    | 小数点隐含位置 |
| ------ | --------- | -------------- |
| Xs     | X1X2...Xn | .              |





浮点机器数：将实数数值大小表示成科学计数法形式

 浮点数 N 由三部分构成：  
 阶码的底 R：隐含表示，一般约定为 2、8 或 16  
 尾数M：系数，为定点小数  
 阶码 E：R 的指数，为定点整数  
 对尾数所表示的定点小数，进行按比例放大（阶码为正数）或者按比例缩小（阶码为负数），数据真值的小数点位置是浮动的——位置由阶码规定

| 阶码(指数，定点整数) | 尾数（系数，定点小数） |
| -------------------- | ---------------------- |
| EsE1E2...Em .        | MS  .  M1M2...Mn       |



 负精度-δ：机器数在数轴上最靠近原点0的负数，计算机能表示的最大负数  
 正精度δ：机器数在数轴上最靠近原点0的正数，计算机能表示的最小正数绝对值称为精度δ或分辨率，代表了机器数所能表示的绝对值最小的非零值  
 机器数的表示范围：[最小数，最大负数]、0、[最小正数，最大数]  
 最大数和和最小数：取决于机器数的编码方式、位数和格式

![](images/b6134e5eaca7a911410e0badcaa00f52a9436d482092a19623417c4bb70ff044.jpg)

下溢：位于最大负数和最小正数之间的数据（除 0 外），机器无法表示。

 处理：计算机直接将其视为机器零。

 上溢：当一个数据大于最大（正）数，或者小于最小（负）数时，机器也无法表示，称为上溢，上溢又称溢出。  
 处理：计算机置溢出标志位，或者报警。

原码表示法

数学定义：真值（X）与编码（[X]原，加权求和对应的二进制数（无符号数））之间的数学关系



[+1101]原=0 1101

X=+1101(+13)

[X]原=0 1101 13



[-1101]原=1 1101

Y=-1101 （-13）

[Y]原=1 1101 29



定点整数

$$\left[ X \right] _{\text{原}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	2^n-X&		X\,\,\le 0\\
\end{cases}
\\ $$

定点小数



$$\left[ X \right] _{\text{原}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	1-X&		X\,\,\le 0\\
\end{cases}$$

表示范围：对于n+1位原码机器数X(包括1位符号位，n位数值位)，所能表示的数据范围位：

定点整数：$-(2^n-1)\le X \le 2^n-1$

定点小数：$-(1-2^{-n}) \le X \le 1-2^{-n}$

 使用原码进行加减乘除运算：规则类似于真值的加减乘除运算  
 符号位单独处理，不能参加运算，参加运算的是绝对值  
 加减运算：  
• 根据符号位决定进行的是绝对值的加还是减  
• 进行绝对值的加减运算  
• 根据绝对值的大小决定结果（和或者差）的符号

表示方法：最高位为符号位，其他位为数值位

 符号位：0－正数，1－负数  
 数值位：与绝对值相同

“，”和”。”只用于助记，在计算机中并无专用部件来表示

对于定点整数：

 若 $X=+X_1X_2...Xn,[X]_原=0,X1X2...X_n$ 

若 $X=-X_1X_2...Xn,[X]_原=1,X1X2...X_n$ 。

 对于定点小数：

 $X=+0.X_1X_2...Xn,[X]_原=0.X1X2...X_n$ 

 $X=-0.X_1X_2...Xn,[X]_原=1.X1X2...X_n$ 

补码



定点整数

$$\left[ X \right] _{\text{补}}=\begin{cases}
	X,&		X\,\,\ge 0\\
	2^{n+1}+X&		X\,\,< 0\\
\end{cases}
\\ $$

$[X]_{补}=2^{n+1}+X(mod \, \, 2^{n+1})$

定点小数



$$\left[ X \right] _{\text{补}}=\begin{cases}
	X,&		X\,\,\ge 0\\ 2+X&		X\,\,\ < 0\\
\end{cases}$$

$[X]_{补}=2+X(mod \, 2)$

模2补码，two's complement





2、表示方法：最高位为符号位，其他位为数值位。

 符号位：0－正数，1－负数。  
 数值位：正数时，与绝对值相同；负数时，为绝对值取反后，末位加 1。

| [x]= | X0   | X1   | X2   | X3   |
| ---- | ---- | ---- | ---- | ---- |
| 权   | -2^3 | 2^2  | 2^1  | 2^0  |

真值=加权求和

对于定点整数:

■ 若X=+XX..X， 则[X]补= 0.,X.X..Xn  
$\not \equiv \emptyset \mathbb { X } = - \mathbb { X } _ { 1 } \mathbb { X } _ { 2 } . . . . . . \mathbb { X } _ { n } , \mathbb { M } \subseteq \mathbb { X } _ { 1 } = \ 1 , \overline { { X _ { 1 } } } \overline { { X _ { 2 } } } . . . . . . . \ \overline { { X _ { n } } } \ + \ 1$

对于定点小数：

$\begin{array} { r } { \dot { \Xi } \mathsf { X } = + 0 . \mathsf { X } _ { 1 } \mathsf { X } _ { 2 } . . . . . . . \mathsf { X } _ { \mathrm { n } } \ , \perp \sharp [ \mathsf { X } ] _ { \sharp \flat } = 0 . \mathsf { X } _ { 1 } \mathsf { X } _ { 2 } . . . . . . . \mathsf { X } _ { \mathrm { n } } } \end{array}$ ${ \bf \omega } = + { \bf 0 }$   
■ 若X=-0. $\mathbf { X } _ { 1 } \mathbf { X } _ { 2 } . . . . . . \mathbf { X } _ { n }$ ，则 $[ \mathsf { X } ] _ { * \mathsf { h } } = 1 .$ . X X... X +.....1.

0的表示：0 的补码表示形式是唯一的，即分别按照正数和负数表示均一致，为全零。

 $[ + 0 ]$ 补＝ 00…0 [-0]补 $= 0 0 . . . 0$   
 （2）表示范围：对于 $\mathsf { n } + \mathsf { 1 }$ 位补码机器数 X，它所能表示的数据范围为：  
 定点整数： $- 2 \mathsf { n } { \mathsf { \leq } } \mathsf { X } \leq 2 \mathsf { n } - 1$   
 定点小数： $- 1 \leq x \leq 1 - 2 - \mathsf { n }$

# （3）补码运算

 补码的符号位同数值位一起参加运算   
 可以将减法转化为加法  
 简化了运算器的结构

 计算机中的整型数据（int）均用补码来表示反码

# 定点整数

$$
[ \mathbf {X} ] _ {\text {反}} = \left\{ \begin{array}{l l} \mathbf {X} & \mathbf {X} \geq 0 \\ 2 ^ {n + 1} - 1 + \mathbf {X} & \mathbf {X} \leq 0 \end{array} \right.
$$

$$
(\mod (2 ^ {n + 1} - 1))
$$

# 定点小数

$$
[ \mathrm {X} ] _ {\text {反}} = \left\{ \begin{array}{l l} \mathrm {X} & \mathrm {X} \geq 0 \\ 2 - 2 ^ {- n} + \mathrm {X} & \mathrm {X} \leq 0 \end{array} \right.
$$

（ mod (2-2-n) )

、表示方法：最高位为符号位，其他位为数值位。  
 符号位：0－正数，1－负数。  
 数值位：正数时，与绝对值相同；负数时，为绝对值取反

双值位，正数时，与绝对值怕问，贝数的，为绝对值取汉

对于定点整数：

·若 $\mathsf { X } = + \mathsf { X } _ { 1 } \mathsf { X } _ { 2 } . . . . . . \mathsf { X } _ { n } ,$ $\mathbb { M } [ \mathbf { X } ] _ { E } = 0 , \mathbf { X } _ { 1 } \mathbf { X } _ { 2 } . . . . . . . \mathbf { X } _ { n }$

·若 $\scriptstyle ( = - \textsf { X } _ { 1 } , \textsf { X } _ { 2 } , \ldots , \textsf { X } _ { n }$ ，则[X]反=1,xx... Xn

对于定点小数：

·若 $\mathsf { \pmb { \Lambda } } = + \mathbf { 0 } . \mathsf { \pmb { X } } _ { 1 } \mathsf { \pmb { X } } _ { 2 } . . . . . . . \mathsf { \pmb { X } } _ { n }$ $\mathbb { R } ^ { | | \mathbf { \boldsymbol { X } } | } \mathbb { R } ^ { = } \mathbf { 0 } . \mathbf { \boldsymbol { X } } _ { 1 } \mathbf { \boldsymbol { X } } _ { 2 } . . . . . . . \mathbf { \boldsymbol { X } _ { n } }$   
若X=-0.Xx，则1. $\boldsymbol { \mathfrak { A } } \boldsymbol { \mathfrak { A } } [ \mathbf { X } ] _ { E } = \mathbf { 1 } .$

（1）0的表示：0的反码表示有两种形式

$$
\begin{array}{r l} {[ + 0 ] _ {\text {反}} = 0 0 \dots 0} \end{array}
$$

$$
[ - 0 ] _ {\text {反}} = 1 1 \dots 1
$$

（2）表示范围：对于n $^ +$ 1位反码机器数×，它所能表示的数据范围为：

定点整数：-(2n-1）≤X≤2n-1  
·定点小数:-（1-2-n）≤X≤1-2-n

移码

定点整数
$$
[ \mathrm {X} ] _ {\text {移}} = 2 ^ {\mathrm {n}} + \mathrm {X}
$$

$$
(\mod 2 ^ {n + 1})
$$

2、表示方法：最高位为符号位，其他位为数值位。

 符号位：1－正数，0－负数。  
 数值位：正数时，与绝对值相同；负数时，为绝对值取反后，末位加 1。

值位，正效的，与绝对值怕问，贝双的，为绝对值耿反旧，不位加

# 对于定点整数：

移码=补码的 符号位取反

·若 $\mathfrak { c } { = } { + } \mathfrak { X } _ { 1 } \mathfrak { X } _ { 2 } { \dots } { \dots } \mathfrak { X } _ { n }$ ，则 $[ \mathsf { X } ] _ { \mp \mathcal { B } } = \mathsf { 1 } , \mathsf { X } _ { 1 } \mathsf { X } _ { 2 } . . . . . . \mathsf { X } _ { \mathsf { n } }$   
·若 $\mathbf { \ddot { X } } = - \mathbf { \nabla } \mathbf { X } _ { 1 } \mathbf { X } _ { 2 } \ldots \ldots \mathbf { X } _ { n }$ ，则 $[ \mathbf { X } ] _ { \mathcal { F B } } = \mathbf { 0 } ,$ ,xX Xx.. Xn +1.

（1） 0的表示：0 的移码表示形式是唯一的

 $[ + 0 ]$ 移＝ 10…0 [-0]移＝ 10…0  
 （2）表示范围：对于 $\mathsf { n } + \mathsf { 1 }$ 位移码机器数 X，它所能表示的数据范围为：  
 定点整数： $- 2 \mathsf { n } { \mathsf { \leq } } \mathsf { X } \leq 2 \mathsf { n } - 1$

![](images/17570bda25ff10b972ee9301e89e66c4e3e561a977bba5dfa96f0a63acf2709d.jpg)

# 四种定点机器数的对比

# 1、表示方法

# 定点整数

<table><tr><td>真值</td><td>X=+ X1X2......Xn</td><td>X=- X1X2......Xn</td></tr><tr><td>原码</td><td>[X]原=0 X1X2......Xn</td><td>[X]原=1 X1X2......Xn</td></tr><tr><td>反码</td><td>[X]反=0 X1X2......Xn</td><td>[X]反=1 X1X2......Xn</td></tr><tr><td>补码</td><td>[X]补=0 X1X2......Xn</td><td>[X]补=1 X1X2......Xn+1</td></tr><tr><td>移码</td><td>[X]移=1 X1X2......Xn</td><td>[X]移=0 X1X2......Xn+1</td></tr></table>

# 定点小数

<table><tr><td>真值</td><td>X=+0.X1X2......Xn</td><td>X=-0.X1X2......Xn</td></tr><tr><td>原码</td><td>[X]原=0.X1X2......Xn</td><td>[X]原=1.X1X2......Xn</td></tr><tr><td>反码</td><td>[X]反=0.X1X2......Xn</td><td>[X]反=1.X1X2......Xn</td></tr><tr><td>补码</td><td>[X]补=0.X1X2......Xn</td><td>[X]补=1. X1 X2...... Xn + 0.00......1</td></tr><tr><td>移码</td><td>[X]移=1.X1X2......Xn</td><td>[X]移=0. X1 X2...... Xn + 0.00......1</td></tr></table>

<table><tr><td>真值</td><td>X=+0</td><td>X=-0</td></tr><tr><td>原码</td><td>[X]原=0 00......0</td><td>[X]原=1 00......0</td></tr><tr><td>反码</td><td>[X]反=0 00......0</td><td>[X]反=1 11......1</td></tr><tr><td>补码</td><td colspan="2">[X]补=0 00......0</td></tr><tr><td>移码</td><td colspan="2">[X]移=1 00......0</td></tr></table>

n+1位机器数  

<table><tr><td></td><td>定点整数</td><td>定点小数</td></tr><tr><td>原码</td><td>- (2n-1) ≤X ≤ 2n-1</td><td>- (1-2-n) ≤X≤1-2-n</td></tr><tr><td>反码</td><td>- (2n-1) ≤X ≤ 2n-1</td><td>- (1-2-n) ≤X≤1-2-n</td></tr><tr><td>补码</td><td>-2n≤X ≤ 2n-1</td><td>-1≤X ≤ 1-2-n</td></tr><tr><td>移码</td><td>-2n≤X ≤ 2n-1</td><td>-1≤X ≤ 1-2-n</td></tr></table>

$$
\begin{array}{l} \because [ X ] _ {\text {原}} = X _ {S}, X _ {1} X _ {2} \dots X _ {n} \\ \cdot X _ {S} = 0: X = + X _ {1} X _ {2} \dots X _ {n} \\ X _ {S} = 1: X = - X _ {1} X _ {2} \dots X _ {n} \\ \end{array}
$$

$$
\begin{array}{l} \because [ X ] _ {\text {反}} = X _ {S}, X _ {1} X _ {2} \dots X _ {n} \\ = X _ {S} = 0: X = + X _ {1} X _ {2} \dots X _ {n} \\ \cdot \mathbf {x} _ {s} = 1: X = - \overline {{X _ {1}}} \overline {{X _ {2}}} \dots \overline {{X _ {n}}} \\ \end{array}
$$

[X]补→真值？

$$
\begin{array}{l} \because [ X ] _ {\text {补}} = X _ {S}, X _ {1} X _ {2} \dots X _ {n} \\ \cdot X _ {S} = 0: X = + X _ {1} X _ {2} \dots X _ {n} \\ \cdot X _ {S} = 1: X = - \left(\overline {{X _ {1}}} \overline {{X _ {2}}} \dots \overline {{X _ {n}}} + 1\right) \\ \end{array}
$$

[X]移→真值？

$$
\begin{array}{l} \because [ X ] _ {\text {移}} = X _ {S}, X _ {1} X _ {2} \dots X _ {n} \\ = X _ {S} = 1: X = + X _ {1} X _ {2} \dots X _ {n} \\ \cdot \mathbf {X} _ {s} = \mathbf {0}: X = - (\overline {{X _ {1}}} \overline {{X _ {2}}} \dots \overline {{X _ {n}}} + 1) \\ \end{array}
$$

# 浮点数格式

浮点数N的构成：

$$
N = M \times R ^ {E}
$$

阶码E（Exponent）、尾数M（Mantissa）和阶码的底R（Radix)  
阶码的底R：是一个常数，隐含规定，一般为2、8或16

为什么将数符放置在首位？

将数符放置 在首位，方 便比较大小

![](images/f318b4e4d2f9ec985b58f83758be6fd1d10255482e3dcd00bc9b8f495c476389.jpg)

浮点数格式要素：

$\textcircled{1}$ 位数：阶码位数 $^ +$ 尾数位数→总位数  
$\textcircled{2}$ 编码：阶码和尾数采用的机器数编码  
$\textcircled{3}$ 排列顺序：数符是否在最高位  
$\textcircled{4}$ 其他特殊的编码规则：譬如隐藏位

# 尾数M：定点小数

$$
0. 1 0 1 1 1 0 \times 2 ^ {- 2} = 0. 0 0 1 0 1 1 1
$$

$$
N = M \times R ^ {E}
$$

尾数的位数：决定了浮点数有效数值的精度  
·尾数的符号：数符，代表了浮点数的正负   
·尾数的编码：一般采用原码和补码表示

# 阶码E：定点整数

·阶码的位数：多少决定了浮点数的表示范围  
·阶码的数值：大小决定了数据实际小数点位置与尾数的小数点位置之间的偏移量  
·阶码的符号：阶符，决定了实际小数点位置在尾数的小数点位置的左边还是右边  
·阶码的编码：一般采用移码和补码表示

# 阶码的底R：一般为2、8或16，且隐含规定

![](images/6a0fe239362570bed9f3912109c3557d492e9c9e6cb11a12f124138b78f42013.jpg)

# 非规格化浮点数：

规格化操作：修改阶码和左右移尾数的方法来使其变为规格化浮点数  
右规：尾数进行右移实现的规格化  
左规：尾数进行左移实现的规格化

# 什么情况下要做规格化操作？

尾数有前导零：即 $\textless 1 / 2$ ，需要左规  
尾数运算溢出：即≥1，需要右规

# 使用规格化浮点数表示数据的优点：

提高了浮点数据的精度  
使程序能够更方便地交换浮点数据  
可以使浮点数的运算更为简化

# （自定义格式）规格化浮点数表示方法：

（1）写出数据的二进制真值  
(2）转换为M×2的形式，其中M为没有前导零的定点小数，E为整数  
（3）按照格式写出M和E的规定机器数编码  
（4）按照格式要求排列E和M

浮点数的运算过程中，尾数发生溢出（超出尾数所能表示的范围），进行右规。右规一次即可。

阶码发生溢出时，浮点数被判为溢出

![](images/a61299ff3ee52a556a1dcdca353af19b9a90d7dae7b2db0fa0bfe27f716b35b7.jpg)

# 1. 一些小结论

由于补码表示的最大值和最小值是非对称的

即最大值的绝对值(0111)的原码比最小值的绝对值的(1000)原码要小

对于 n 位定点整数的机器数则为（ $( n + 1$ ）位（算上符号位）

对于一个负数X来说

[X]原+[X]补 $\cdot = 2 \wedge _ { \mathsf { n } }$

Eg.[-2]原 $= 1 0 1 0$ ；[-2]补 $\mathord { \left. \kern - delimiterspace \right.} 1 1 0 $ ，相加为 1000（当成原码并去掉符号位，就是 8）

负数的补码就是其绝对值的补数

X的绝对值 $+ [ x ]$ 补但是[x]补当成原码去掉符号位，为10000即 $^ { 2 \wedge }$ （ $( n + 1 )$ ）

还是上个例子。[-2]补 $= 1 1 1 0 = 1 4$ ， $2 + 1 4 = 1 6$ ；

所以，有符号数和无符号数之间的转换规则是：

位模式不变，但是解释这些位的方式改变了

数值数据的表示

进位计数制

不同数制之间的转换

十进制的编码

机器数

数值数据在计算机中的表示形式称为机器数。机器数的特点是：

$^ \ast$ 机器数：数值数据在计算机中的二进制表示形式。真值：机器数真正表示的数值数据

·机器数的符号位必须被数值化为二进制0和1书写：+/-符号数值（二进制或   
·机器数的小数点用隐含规定的方式来表达  
·表示的数值范围受计算机字长的限制  
·编码方法：不同的排列方式，常见的有原码、反码、补码、移码。

![](images/c47a7a94827b3662a134a37286e20304c8e0e73f91dd09676afa6229802037f6.jpg)

# 定点机器数的表示方法

一个字节由 8 个位组成

我们把这种按照一位一位表示数据的方式称为位模式

对于无符号数编码

在机器中的解释，采用原码表示法（？）

![](images/29519d3b05891aec898580f89a8b7d69cdc6b6f2666f40bc361510a60e4b8e61.jpg)

对于有符号数的编码，采用补码

![](images/3bb2c65a3b93dd5f3ba70445f8e1ac6b1845d70eca6912b30ec7b60296858a1a.jpg)

对于相同的位模式，无符号数和有符号数的数值关系如图所示：

（这里的 B2U/B2T 是位向量到无符号数和有符号数的函数映射）

最高位理解成负权重-2^w-1

$$
B 2 U _ {w} = x _ {w - 1} \cdot 2 ^ {w} + B 2 T _ {w}
$$

用 T2U 来表示有符号数到无符号数的函数映射

$T 2 U _ { w } ( x ) = \left\{ \begin{array} { c } { { x + 2 ^ { w } , x < 0 } } \\ { { x , x > 0 } } \end{array} \right.$ $T 2 U _ { w } \left( x \right) = \left( x + 2 ^ { w } \right)$

$$
U 2 T _ {w} (u) = \left\{ \begin{array}{l} x, u \leq T M \max  _ {u} \\ x - 2 ^ {w}, u > T M a x _ {u} \end{array} \right.
$$

W位(包含了符号位！)补码表示的数值

$$
\omega = - x _ {\omega - 1} 2 ^ {\omega - 1} + \sum_ {i = 0} ^ {\omega - 2} x _ {i} 2 ^ {i}
$$

也就是说，把第一位作为负数- $. 2 \land \mathfrak { n }$ 来处理；正数为 0,负数为 1；

你可能已经发现，二进制数的“互补数”编码规则和补码的定义非常的像，其实不是像，而是它们本来就是等价的。也就是“对应正数的互补数”等于“对应正数按位取反再加1”。下面尝试证明。

原命题精确描述为：相对于 w 位的二进制数，整数 $\mathsf { b } \in ( 0 , ]$ ，即 $\mathsf { b } \in ( 0 , ]$ ，等式 $- b = - b + 1$ 成立。

原码、补码、反码、移码的直接二进制值（机器数的形式值）各自有什么作用？

反码、补码的真值为负数的时候机器数形式值（符号位作为 ${ 2 } \Lambda _ { \mathsf { n } }$ 而不是正负号）减去对应的 $2 \sim ( \mathsf { n } + 1 )$ 或者是 $_ { 2 ^ { \wedge } }$ （n+1） $+ 1$ 就是这个机器数的真值。

移码是无论正负直接减去 $2 \sim ( \mathsf { n } + 1 )$

而原码没有类似的结果

![](images/78e6ebe0fa6d18716eca1d48f88e453ca73f8c16ae9fe3c381407ee46ef7c2df.jpg)

有符号数最高位为 0（正数），其余为 1

![](images/e3ecdb1331e495f2deeb4e6668c8da5f41e4d66251fb5eee1929cfca02758dec.jpg)

有符号数的-1和无符号数的最大值一样编码表示

![](images/d7ebf2a15fdae3ac42d3466cc5c4d421de2dfae73da3be0f75e1620b2f98e562.jpg)

# 2．真值与补码的转换

# 真值->补码

正数的补码：去掉 $^ +$ 号前面加 0。

负数的补码：1、去掉 - 号前面加 1，从右到左找到第一个 1，左边全部取反。

2、负数的补码是将原码的符号位保持不变,其余各位取反，然后加1,就得到其补码;

计算一个负数的补码时，通常遵循以下步骤：

1. 取绝对值的二进制表示：求出绝对值（即对应正数），求出数值的二进制形式。  
2. 取反：将二进制数的每一位取反，即 0 变为 1，1 变为 $0 _ { \circ }$   
3. 加 1：在取反结果的基础上加 1，得到最终的补码表示。

也就是说，符号位参与了运算。在第 2 步实际上已经将“符号位为 1“表示成 0-1

实际上，这个符号位啊，你无论是先不管符号位取反再上符号位为 1，还是一起从绝对值取反（从0变成1—），不都是符号位为1吗？但参与 $+ 1$ 运算是必须的。

# 补码- $\cdot >$ 真值

符号位 0 的补码的真值：去掉 0 前面加 $^ +$ 号。

符号位1的补码的真值：

1、去掉 1 前面加-号，从右到左找到第一个 1，左边全部取反。  
2、负数的原码就是它的补码的补码。  
3、如果补码的符号位为“1”，表示是一个负数，那么补码减1,再将符号位保持不变其余各位取反

# 3.对于 $( X + 2 \land ( \mathbf { n } + 1 ) )$ mod (2^(n+1))的解释

对某两个整数a，b，若它们除以正整数 $\mathsf { m }$ 所得的余数相等，则称a，b对于模m同余，也就是严格来说，存在整数k使得

$a - b = k m$ ，则称 a,b 对于除数 $\mathsf { m }$ 是同余的。一般记做

$$
a \equiv b (\bmod m)
$$

在模运算中，一个数与它除以“模”后得到的余数是等价的，如 A、B、M 满足

$\mathsf { A } { = } \mathsf { B } { + } \mathsf { K } { \times } \mathsf { M } ( \mathsf { K }$ 为整数)，则记为 $\mathsf { A } \equiv \mathsf { B } ( \mathsf { m o d } \mathsf { M } )$ )，即 A、B各除以 M后的余数相同。在补码运算中，[A]补-[B]补=[A]补 $+ \mathsf { M }$ -[B]补，而 M-[B]补 $=$ [-B]补，因此补码可以借助加法运算来实现减法运算。从模运算的角度，补码的表示利用了以下规律：

模运算的同余性质：对于任意整数 a 和模数 $\mathsf { m }$ ，有 $\mathsf { a } \equiv \mathsf { a } + \mathsf { k m } ( \mathsf { m o d } \mathsf { m } )$ ，其中 k为整数。这意味着在模 $\mathsf { m }$ 的运算中，数值是循环的，超过 $\mathsf { m }$ 会回到起点。

为何常见写法是 $^ { 6 6 } x + 2 \wedge _ { \mathsf { n } + 1 }$ mod $\mathsf { \pm } \mathsf { \Lambda } \mathsf { n } \mathsf { \pm } ^ { \prime }$ 1”而不是 $\pmb { \times }$ mod $^ { 2 n + 1 }$

数论上， $^ { * } \times$ 与 $\mathsf { x } + 2 \wedge \{ \mathsf { n } + 1 \} \times ^ { \prime \prime }$ 在模 $2 \cdot \{ \mathsf { n } + 1 \}$ 下等价；

但在说明“补码如何把负数映射到二进制的高半区”时，显式地加上 $2 \times \{ \mathsf { n } + 1 \}$ 更能直观反映“负数被搬到了高位 $\ O = \uparrow$ 的区间”这个事实。

 非负数直接写成“它自己” (因为落在小半区间 $[ 0 , 2 \land \mathsf { n } ) ]$ )；  
 负数写成 $^ { \mathfrak { a } } \mathsf { X } + 2 ^ { \wedge } \{ \mathsf { n } + 1 \} ^ { \prime \prime }$ (因为这样就落在大半区间 $[ 2 \land \neg , 2 \land \{ \mathsf { n } + 1 \} - 1 ] ) _ { \circ }$

在计算机系统中， $\mathsf { n }$ 位定点整数（包括符号位）补码的取值范围是 $- 2 \land \mathsf { n }$ 到 $2 \ n _ { \mathsf { n } } - 1$ 。

这意味着总共有 $2 \cdot \{ \mathsf { n } + 1 \}$ 个不同的数值可以表示。因此，模数 $2 \cdot \{ \mathsf { n } + 1 \}$ 对应于这些数值的总数量。

负数的表示：在模 $2 \cdot \{ \mathsf { n } + 1 \}$ 的系统中，负数 X 可以表示为 $2 \wedge \{ \mathsf { n } + 1 \} + \mathsf { X } ,$ ,因为 X 为负数，会落在 $2 \land ( \mathsf { n } )$ 到 $2 \cdot \{ \mathsf { n } + 1 \} - 1$ 的范围内，符合无符号数的表示范围。

因为模为 $2 \cdot ( n + 1 ) , k = 1$ $k = 1$ ，那么就可以将- $2 ^ { \wedge } \mathsf { n } - 2 ^ { \wedge } \mathsf { n } - 1$ 统一成 $( X { + } 2 ^ { \wedge } ( \mathsf { n } { + } 1 ) )$ ) mod $( 2 \land ( \mathsf { n } + 1 ) )$

减法（加上一个负数）的运算用加法代替了，我们说的补码（反码）实际上是数对于一个模的同余数。

（这里的取模运算，请让我们抛弃符号数，eg.-2 mod $8 { = } 6$ , $[ 6 ] { = } 1 1 0$ ,而 [-2]补 $\mathord { = } 1 1 1 0$ ，当成原码，去掉符号位）

规定：把0当成正数，也即 $+ 0$ ，这样0的编码就变成：0，0000000。那8位二进制表示的正数范围仍然是： $+ 0 -- + 1 2 7 _ { \mathrm { { ( } } }$ 。

但是，对于负数就必须要做调整，也即-0必须要让位---1，0000000这个编码不能表示-0。我们可以把负数整体向后“挪动1位”：只要将8位二进制表示的负数范围从：-127—— -0变成：-128 —— -1，就能成功解决问题。

-0 的补数是 $2 5 6 - 0 = 2 5 6 = 0 \times 1 0 0$ ，由于是“8 位二进制数”，所以-0 的补数是 $0 \times 0 0$ ；‘我们知道“- $\cdot 1 = 0 - 1 \prime$ ，所以

-1 的补数是 $2 5 6 - 1 = 2 5 5 = 0 \times 1 =$ ；这就好比是"0-1"不够减，"借 256"得到的（这里借的是模数值）。

同理，可以-2~-127的补数；

注意：这里的补数，就是计算机所讲的补码。

-127 的补数是 $2 5 6 - 1 2 7 = 1 2 9 = 0 \times 8 1$

-1~-127 的补码范围： $0 { \times } \mathsf { F F } { \sim } 0 { \times } 8 1$

负数-128的补码：

我们知道“- $\cdot 1 2 8 = 0 - 1 2 8 ^ { \prime \prime }$ ，“ $- 1 2 8 = - 1 + - 1 2 7 ^ { \prime \prime }$ 所以

-128 的补数是 $2 5 6 - 1 2 8 = 1 2 8 = 0 \times 8 0$ ；所以-128 的补码为 0x80，但是-128 没有原码和反码。所以人为地规定 10000000 表示-128

总结：

补码补码，就是补上去一个模对应的补数

# 小结

在一个区间长度为 M 内，统一正负数的常用方法是

$$
X ^ {\prime} = (X + M) \mod M
$$

其中 M 就是模数。如果你换成一个非 M 的倍数 N，则只有在 $\Nu \equiv 0$ (mod M)的情况下才能达到同样效果。因此，负数加上的部分必须是 M 的倍数，通常取最小正倍数 M 来实现统一。

可以这么理解：如果一个区间（或集合）恰好包含 $\mathsf { m }$ 个整数，并且这 $\mathsf { m }$ 个整数构成了一个模 $\mathsf { m }$ 的完全剩余系，那么对任意整数 X，用

$$
X \bmod m
$$

总能得到落在这个集合中的唯一代表。换句话说，只要这个集合包含的元素个数为 m（而且互不同余），那么无论 X是正数还是负数，都有

$$
X \equiv X \bmod m
$$

而且 Xmodm 就是该模 m 意义下的标准表示。

# 为什么定点小数的模 2？

至于模数为 2 的说法，这是因为补码表示中，数值的表示是循环的。例如，-1 和 $1 - 2 \land ( - \mathsf { n } )$ 之间的差值正好是 $2 - 2 \land ( - \mathsf { n } )$ ，但由于补码的循环特性，这个差值在模 2 的意义下是等价的。$- 2 \land ( - \mathsf { n } )$ 并没有被省略，而是补码表示的范围已经包含了从 -1 到 $1 - 2 \land ( - \mathsf { n } )$ 的所有可能值。补码的模数为 2 是因为补码表示中，数值的表示是循环的，且循环周期为 2。

# 关于数的扩展

基本上是这样的。对两类数来说：

高位扩展（符号扩展）：  
低位扩展（增加精度）：

# 定点整数的符号扩展：

对于无符号数，称为零扩展

对于有符号数，称为符号位扩展

在原符号位和数值位中间添加新位，正数都添0，负数原码添0，负数反、补码、移码添1。

$$
\begin{array}{l} B 2 T _ {w} \left(\left[ x _ {w - 1}, x _ {w - 2}, \dots , x _ {0} \right]\right) (1) \\ B 2 T _ {w + k} \left(\left[ x _ {w - 1}, \dots , x _ {w - 1}, x _ {w - 1}, \dots , x _ {0} \right]\right) (2) \\ B 2 T _ {w + 1} - B 2 T _ {w} = 0 \\ \end{array}
$$

# 定点小数的符号扩展：

在原符号位和数值位后面添加新位，正数都添0，负数原、补码、移码添0，负数反码添1。

# 低位截断

将 int 类型强制转换为 short 类型，高 16 位被丢弃

将一个 $\pmb { \mathsf { W } }$ 位的无符号数，截断成k位的方法是，丢弃最高的w-k位。截断操作可以对应于取模运算。

$$
B 2 U _ {w} \left(\left[ x _ {w - 1}, x _ {w - 2}, \dots , x _ {0} \right]\right) \mod 2 ^ {k} = B 2 U _ {k} \left(\left[ x _ {k - 1}, x _ {k - 2}, \dots , x _ {0} \right]\right)
$$

# 截断有符号数

先转换成无符号数，再截断，再转换成有符号数

即

$$
T ^ {2} U _ {w} (x) = \left\{ \begin{array}{c} x + 2 ^ {w}, x <   0 \\ x, x > 0 \end{array} \right., \text {即} T 2 U _ {w} (x) = (x + 2 ^ {w}) \mod 2 ^ {w}
$$

$$
B 2 T _ {k} \left(\left[ x _ {k - 1}, \dots , x _ {0} \right]\right) = U 2 T _ {w} \left(\left[ B 2 T _ {w} \left(\left[ x _ {w - 1}, x _ {w - 2}, \dots , x _ {0} \right]\right) + 2 ^ {w} \right] \mod 2 ^ {w} \right] \mod 2 ^ {k}) = U 2 T _ {w} \left(B 2 U _ {w} \left(\left[ x _ {w - 1}, x _ {w - 2}, \dots , x _ {0} \right]\right) \mod 2 ^ {k}\right)
$$

# 4、其他运算符

# 布尔运算（位级运算）

~/NOT 非（取反）（单目运算）

&/AND 与

|/OR 或

^/EXCLUSIVE-OR 异或

取反的时候：

因此，可以总结出~按位取反的计算结论是： $\sim \mathsf { n } = - ( \mathsf { n } + 1 )$

例如本例中， $\mathord { \sim } 5 = - ( 5 + 1 )$ ，即 $\mathord { \sim } 5 = - 6$

# 逻辑运算

所有非零参数为 true，参数 0 表示 false

结果只有两个，true与false 惰性运算

|| OR

&& AND

! NOT

# 移位运算

逻辑移位。将移位的数据视为无符号数据，移位的结果知识数据位置发生了变化。移出的数据位一般置入CF标志位(进位、借位 标志)

算术移位，对象是有符号数，算术移位的结果在绝对值上进行放大缩小；符号位保持不变。

计算机的算术移位指令大多采用补码的 移位规则

循环移位，左移时最高位移入最低位，右移时最高位移入最低为，若和CF标志位一起循环，则称为大循环，否则小循环

左移相当于乘以2，右移相当于除以二

CF: 进位/借位标志。最近的操作使最高位产生了进位。可用来检査无符号操作的溢出。 加法运算时 $\textstyle \sum = 1$ ,则CF置1表示进位；减法运算时 $C { = } 0 , C F$ 置1表示借位。CF只对无符号数运算有意义。

ZF: 零标志。最近的操作得出的结果为 0（全零）则 ZF 置 1。  
SF: 符号标志。记录运算结果的符号，它与运算结果的最高位相同。采用补码表示，运算结果为正数置0，负数置1。  
OF: 溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。有符号数有意义。有溢出则置1，否则置0；  
PF:奇偶标志位。操作数 1 的个数为偶数置 1，否则置 0；

# 左移

逻辑左移，高位移出，低位补0

左移不区分算术还是逻辑

对于原码的算术左移，符号位不变，高位移出，低位补 0；

当左移移出的数据位为“1”时，发生溢出。

对于补码的算数左移。符号位不变，高位移出，低位补0；当左移移出的数据位正数为1负数为0时（符号位与被移出的位不同），发生溢出。一次。为保证不发生溢出，移位数据的最高有效位必须与符号位相同

因此，在硬件补码实现算数左移时，直接将数据的最高有效位移入符号位，当不发生溢出时，不会改变机器数的符号

# 右移

逻辑右移，低位移出，高位补0

对于原码的算数右移，符号位不变，低位移出，高位补0

算数右移

对于补码，符号位不变，低位移出，高位补符号位

对于原码，符号位不变，低位移出，高位补0

C语言中一个特性就是支持按位进行布尔运算（位运算）

位运算的用法就是实现掩码运算

特定的位序列

比如说和0xFF，进行与运算，就是其本身

# 5、机器数编码与真值

为什么原码、补码、反码、移码 作为机器数的时候，符号位算作 $2 \land \mathsf { n ? }$

关于移码

以 8 位数为例，总共能表示 256 个数，把这些数加上一个固定的值，从而形成新的码值（还是 8 位），这就是移码的定义。例如，可以把有符号数映射到 0 - 255 的段上。

移码的优势：原来的大小关系不变，且一一对应（没有两种表示的 0），很容易判断大小（如判断是最小值或者最大值）

64 为机器上，不同的数据类型，所占的字节数不同，数值范围取值不同

Long 在 64 位机器上占 8 个字节 32 位机器上，long 占 4 个字节

Unsigned关键字 数字只能为非负数，无符号数

<table><tr><td>C data type</td><td>Min</td><td>Hexadecimal</td><td>Max</td><td>Hexadecimal</td><td>Bytes</td><td></td><td></td></tr><tr><td>[signed] char</td><td>-2^7</td><td>0x80</td><td>2^7-1</td><td>0x7F</td><td>1</td><td></td><td></td></tr><tr><td>Unsigned char</td><td>0</td><td></td><td>2^8-1</td><td>0xFF</td><td>1</td><td></td><td></td></tr><tr><td>Short</td><td>-2^15</td><td>0x8000</td><td>2^15-1</td><td>0x7FFF</td><td>2</td><td></td><td></td></tr><tr><td>Unsigned short</td><td>0</td><td></td><td>2^16-1</td><td>0xFFFFFF</td><td>2</td><td></td><td></td></tr><tr><td>Int</td><td>-2^31</td><td>0x8(7个0)</td><td>2^31-1</td><td>0x7(7个F)</td><td>4</td><td></td><td></td></tr><tr><td>Unsigned int</td><td>0</td><td></td><td>2^32-1</td><td>0x(8个F)</td><td>4</td><td></td><td></td></tr><tr><td>Long</td><td>-2^63</td><td>0x8(15个0)</td><td>2^63-1</td><td>0x7(15个F)</td><td>8</td><td></td><td></td></tr><tr><td>Unsigned long</td><td>0</td><td></td><td>2^64-1</td><td>0x(16个F)</td><td>8</td><td></td><td></td></tr><tr><td>Long long</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Int32_t</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Uint 32_t</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Int 64_t</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Uint64_t</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Float</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Double</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Long double</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table>

![](images/1a41381584803073f6746fb38769bedaa0499f690915a2f9652a86f1e498a1d5.jpg)

假设一个整数的数据类型有w位，用向量x表示

For vector $\vec { x } = [ x _ { w - 1 } , x _ { w - 2 } , \cdots , x _ { 0 } ]$

$$
B 2 U _ {w} (\vec {x}) \doteq x _ {w - 1} \cdot 2 ^ {w - 1} + x _ {w - 2} \cdot 2 ^ {w - 2} \dots
$$

B2U 的意思是 binary to unsigned

对于有符号数的编码采取补码的方式

$$
B 2 T _ {w} (\vec {x}) \dot {=} x _ {w - 1} \cdot - 2 ^ {w - 1} + x _ {w - 2} \cdot 2 ^ {w - 2} \dots
$$

这里最高位为1时表示负数，最高位为0时表示非负数

最高位也叫做符号位

关于符号位，需要理解负权重的概念，而不能简单的当成一个负号

记住对于无符号数，最高位的1表示的不是权重

也就是说， $- 2 \land 3 = - 8$

-1在有符号数全为1，但在无符号数为最大值

如果在计算的时候一个是有符号数，一个是无符号数，

C语言会隐式地将有符号数转换为无符号数

# 6、溢出与取模运算的数学关系

设我们有两个 w 位无符号整数 a 和 b，其和为 S，即

$$
S = a + b
$$

由于二进制表示限定为 w 位，系统只能表示 0 到 2w−1 内的数。因此，任何 S 超出这一范围的部分都会被丢弃。用数学语言描述就是：实际存储的结果 R 为

$$
R = S \bmod 2 ^ {\wedge} w
$$

也就是说，在加法运算中，丢弃溢出位的操作等同于计算 S 对 $_ { 2 } \wedge _ { \mathsf { W } }$ 取模。这正是计算机硬件中处理无符号整数溢出的方式

很多人可能会疑惑，既然阶码字段有 8 位，那么为什么不选择 $2 ^ { \wedge } 7 = 1 2 8$ 作为偏移量？原因在于：

对称分布的需求：以 127 为偏移量，可以使得存储阶码为 127 时实际指数为 0。这种设计使得正指数和负指数在规格化数中分布较为对称，便于硬件实现和算法设计。  
历史约定与标准化：IEEE754 标准规定的偏移量就是 127，它的选择经过广泛验证并且与现有的硬件架构和软件设计高度契合。采用 127 而非 128 使得编码与译码的过程更加简便，同时避免了 0 不对称的问题。  
具体来说，设若采用 128 作为偏移量，则当存储阶码 E 为 128 时，实际指数为0；但这会使得整个指数范围整体右移，从而使得可表示的最小负指数与最大正指数的数量不均衡，不符合 IEEE754 对于规格化数的要求。选择 127 则能使得 0 成为一个中心值，既便于表达接近1 的数值，又能合理覆盖较大范围的指数。

# 5.3. 关于阶码真值为 -127 和 128

一般我们正常探讨的阶码区间是 $- 1 2 6 \mathsf { D } \sim 1 2 7 \mathsf { D }$ ，而真值 -127D 的阶码为 0000 0000B，真值 128D 的阶码为 1111 1111B。

# 5.3.1. 阶码真值为 -127

当阶码全为 0 ，尾数不全为 0，表示 非规格化小数 ，用来表示比最小绝对值还要小的数，即

尾数码 隐含的最高位不是 1，而是 0；

阶码真值 固定为 -126，而非 -127；

当阶码全为 0 ，尾数全为 0，表示 真值 $+ / - 0$

# 5.3.2. 阶码真值为 128

1. 当阶码全为 1 ，尾数全为 0，表示 正负无穷大 +/- ∞  
2. 当阶码全为 1 ，尾数不全为 0，表示非数值 NaN（Not a Number）

如 0/0， $\infty - \infty$ 等非法运算的结果即为 NaN

汉字输入法程序：将汉字输入计算机转换成汉字内码

1、输入—汉字输入码，也称作外码， 由西文字符编码而成（拼音编码、字形编码等）  
2、存储、交换和检索—内码 ，两个字节表示。汉字内码在计算机中是唯一的。（区位码、国标码、汉字内码2个字节最高位均为“1”）  
3、交换—交换码，是指不同的具有汉字处理功能的计算机系统之间在交换汉字信息所用的代码标准。  
4、输出——字形码 点阵表示法 字模码：用于汉字的显示和打印

汉字字库——— 所有汉字的字模点阵代码按顺序集中存放根据内码查表

字形检索程序：将汉字的机内代码转化为汉字的字形码

# 整数的运算

计算值： $x { + } y$

实际值：计算机中实际上保存的结果

${ } _ { w y } ^ { w }$ $w$

溢出时，计算值 $\mathop {    }$ 实际值 $\pm 2 \land \_$ （这里相当于是原码！）

如何判定运算结果是否发生了溢出

Int uadd.ok(unsigned x,unsigned y)   
{ unsigned sum $\equiv$ x+y; If (sum $\rightharpoondown$ x)   
Return 1; else return 0;   
}

# 有符号整数

为了避免数据大小的扩张，最终结果将截断为w位；即实际上数字只占w-1位两个异号的数字肯定不会溢出

两个同号的才有可能溢出

![](images/3390337029ead83d93ec3a52189a1c769867939c392af0161ac824c78e907384.jpg)

正溢出/上溢

负溢出/下溢

减法转换成加法来做

$x - y = x + (-y) = x + (-y + 1)$

![](images/28aaa54c06c24037d9b1537962c7c3302913f8ecd66b2e073b85e38b433cb4c3.jpg)

$$
F o r x a n d y, x + \mathbf {\Lambda} _ {w} ^ {t} y = \left\{ \begin{array}{l l} x + y - 2 ^ {w - 1} - 2 ^ {w - 1} = x + y - 2 ^ {w}, 2 ^ {w - 1} \leq x + y, \text {正 溢 出} \\ x + y, - 2 ^ {w - 1} \leq x + y <   2 ^ {w - 1} \\ x + y + 2 ^ {w}, x + y <   - 2 ^ {w - 1}, \text {负 溢 出} \end{array} \right.
$$

对于正溢出，正溢出实际上是让符号位从 1变成0，计算值 $\equiv$ 实际值 $+ 2 \land _ { \mathsf { W } , }$ ,它没被截断，最高位由0变成了1，这两个数本来就没有- $\mathbf { \mathcal { Z } ^ { \wedge } }$ （w-1)的权重结果有了，那么实际值就要加上2^（w-1），又因为补码的定义，又得减去 $2 \setminus ( \mathsf { w } - 1 )$

对于负溢出，计算值 $=$ 实际值- ${ \mathcal { 2 } } ^ { \wedge } \mathsf { w }$ ，这里因为原来两个最高位符号位从 1变成0，两个数本来有- ${ \mathcal { 2 } } ^ { \wedge } \mathsf { w }$ 的权重结果没了。那么实际值就要减去个- $. 2 \land _ { \mathsf { W } }$

如何判断溢出？

两个正数相加，得到结果为负，正溢出

两个负数相加，得到结果 $\geqslant 0$ ，负溢出

加法逆元

$$
F o r x, 0 \leq x <   2 ^ {w}, x + x ^ {\prime} = x ^ {\prime} + x = 0
$$

$$
y - x - > y + x ^ {\prime}.
$$

对于无符号整型来说， $\mathsf { x } + \mathsf { x } ^ { \prime } { = } 2 \mathsf { \Lambda } \mathsf { w } { = } 0$

$$
x ^ {\prime} = \left\{ \begin{array}{l} x, x = 0 \\ 2 ^ {w} - x, x > 0 \end{array} \right.
$$

对于补码表示的有符号数的逆元比较简单

$$
x ^ {\prime} = \left\{ \begin{array}{l} - x, x > T M i n _ {w} \\ T M i n _ {w}, x = T M i n _ {w} \end{array} \right.
$$

由于补码最大值比最小值的绝对值要小

即 $0 1 1 1 < 1 0 0 0$

关于 最小值的逆元要通过负溢出 的方法来实现

即

$$
T \min  _ {w} + T \min  _ {w} = - 2 ^ {w} = 0
$$

X、y 都为 w 位，乘积结果可能为 2w 位，c 语言定义无符号数乘法所产生的结果是 w 位因此，z=xy mod $_ { 2 } \wedge _ { \mathsf { W } }$

对于有符号数，我们有 z=U2T(xymod2^w)

X’y’ mod 2^w=(xy) mod ${ 2 } ^ { \wedge } \mathsf { w } .$ .即有符号整数和无符号整数高位截断后结果的位级表示相同整数的乘法往往利用移位运算（拆解成与多个 $2 ^ { \land } \mathsf { k }$ 相乘再相加减）

整数的除法遇到除不尽的情况，总是向0舍入

但是，移位的时候会导致向下舍入。为此，我们要在移位之前加入偏置。

即如果要右移 k 位，在低 k 位加上 $2 \land k - 1$ , 向 $k { + 1 }$ 产生一个进位，实现了向 0 取整。

即用整除实现了向上取整

举个例子：

$$
K = 0
$$

$$
1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 0 - 1 2 3 4 0
$$

$$
K = 4 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 - 7 7 2 \text {而} 1 2 3 4 0 / 2 ^ {\wedge} k = - 7 7 1. 2 5;
$$

加上偏置，1100111111011011，右移四位有 1111110011111101,即-771。

division by a power of 2

$$
(x <   0? x + (1 <   <   k) - 1: x) > > K
$$

但是，除以2不能推广到除以任意整数浮点数

<table><tr><td>类型</td><td>总 位 数</td><td>尾数</td><td>阶码</td><td>真值计算</td><td></td><td></td></tr><tr><td>短 实 数</td><td>32</td><td>24</td><td>8</td><td>\( N = {\left( -1\right) }^{M} \times  \left( {{1.5}{M}_{1}M{2\ldots }{M}_{n}}\right)  \times  {2}^{E - {127}} \)</td><td></td><td></td></tr><tr><td>长 实 数</td><td>64</td><td>53</td><td>11</td><td>\( N = {\left( -1\right) }^{M} \times  \left( {{1.5}{M}_{1}M{2\ldots }{M}_{n}}\right)  \times  {2}^{E - {1023}} \)</td><td></td><td></td></tr><tr><td>临 时 实数</td><td>80</td><td>65</td><td>15</td><td></td><td></td><td></td></tr></table>

![](images/3caf6d389607f56b60584b40fcc4fecb687f2270ed1d9b484c2da9a93b7e2872.jpg)

符号位 阶码 尾数

# 7、IEEE754

Float32bit

Double64bit

我梦里的财富：+302657264526￥

阶码

y

符号

尾数

符号：决定数值的正负性

尾数：影响数值的精度。尾数的位数越多，精度越高

阶码：反映小数点的实际位置

基数：K进制通常默认基数为K

规格化：确保尾数的最高位非0数位刚好在小数点之前

阶码确定范围

尾数影响精度

![](images/79f181b47490d71aa33641df7b5c4485f39a62657deff27543ee4ad27dd2b53e.jpg)

$$
V = (- 1) ^ {S} \times M \times 2 ^ {E}
$$

尾数用原码定点小数表示

阶码用移码，规定偏置值为127

$\mathsf { S } { = } 0 _ { - }$ ,正数； $s { = } 1$ 负数；M 为小数部分，尾数部分，frac。E 为指数部分，阶码，exp。

Emin=1.emax $= 2 5 4$ ，对半分，所以要减去 $2 5 4 / 2 { = } 1 2 7$ ；

第一位总是1，因此没必要显示出来，所以尾数部分要加1

![](images/e50dc1d79cdffb23905de3ed3b7c0658a8254a152177a16d4d0e0392f652513b.jpg)

![](images/bd23b66fa0ae5d5aa0cccc7dda113d13d37aca406c550155e1c82dd36201b0e2.jpg)

如何将十进制真值转换为偏置值为M的移码？

②按“无符号整数”规则转换为指定位数

# 小数点前的 1 省略了（隐藏了 1）

![](images/d598243f6708b4a1a023068860747b875a9ef2e74e3149a5cb201ad75a8e9e35.jpg)

1、当阶码字段二进制位不全为 0，也不全为 1 时，（0 和 255），规格化  
2、当阶码字段全为 0，非规格化.1、尾数部分也全为 0，则当 $\mathsf { S } { = } 0$ ，表示正 0， $s { = } 1$ ，负0；

表示非常接近 0 的数；如果尾数不为 0，则 $\mathsf { E } { = } \mathsf { 1 }$ -bias， $\mathsf { M } = \mathsf { f }$ 不加 1

![](images/650d5305479445f75aede3bdffbb25a65884bf601e7cfc1f140fcc4261742161.jpg)

3、当阶码字段全为 1，特殊值；当尾数为 0 时， $\mathsf { S } { = } 0$ ，正无穷； $s { = } 1$ ，负无穷；当尾数不为0时，表示NaN表示不是一个数

![](images/c7544ae05a23243dd7e02061d4e04648f67639f1185b2a400c3cdfb32356d57d.jpg)

单精度为例  

<table><tr><td>Ms</td><td>E</td><td>M</td><td>意义</td></tr><tr><td>0/1</td><td>0</td><td>0</td><td>±0</td></tr><tr><td>0/1</td><td>0</td><td>非0</td><td>非规格化数</td></tr><tr><td>0/1</td><td>1~254</td><td>任意</td><td>规格化数</td></tr><tr><td>0/1</td><td>255</td><td>0</td><td>±无穷大</td></tr><tr><td>0/1</td><td>255</td><td>非0</td><td>NaN</td></tr></table>

NaN:非数 (not a number)

<table><tr><td>0</td><td>J J J J J J</td><td>J J………J J</td><td>H9N</td></tr><tr><td>0</td><td>J J J J J J</td><td>……</td><td>H9N</td></tr><tr><td>0</td><td>J J J J J J</td><td>00………0J</td><td>H9N</td></tr><tr><td>0</td><td>J J J J J J</td><td>00………00</td><td>+∞</td></tr><tr><td>0</td><td>J J J J J J</td><td>J J………J J</td><td>粤羊锁怀正貌</td></tr><tr><td>0</td><td>……</td><td>……</td><td>锁怀正貌</td></tr><tr><td>0</td><td>0000000J</td><td>00………00</td><td>粤羊锁怀正貌</td></tr><tr><td>0</td><td>00000000</td><td>J J………J J</td><td>粤羊非锁怀正貌</td></tr><tr><td>0</td><td>……</td><td>……</td><td>非锁怀正貌</td></tr><tr><td>0</td><td>00000000</td><td>00………0J</td><td>粤羊非锁怀正貌</td></tr><tr><td>0</td><td>00000000</td><td>00………00</td><td>+0</td></tr><tr><td>W2</td><td>E</td><td>W</td><td>解锁</td></tr></table>

<table><tr><td>J</td><td>J J J J J J J</td><td>J J………J J</td><td>U9U</td></tr><tr><td>J</td><td>J J J J J J J</td><td>……</td><td>U9U</td></tr><tr><td>J</td><td>J J J J J J J</td><td>00………0J</td><td>U9U</td></tr><tr><td>J</td><td>J J J J J J J</td><td>00………00</td><td>--∞</td></tr><tr><td>J</td><td>J J J J J J J</td><td>J J………J J</td><td>晋1非顿报快改新</td></tr><tr><td>J</td><td>………</td><td>………</td><td>顿报快改新</td></tr><tr><td>J</td><td>0000000J</td><td>00………00</td><td>晋1非顿报快改新</td></tr><tr><td>J</td><td>00000000</td><td>J J………J J</td><td>晋1非顿报快改新</td></tr><tr><td>J</td><td>………</td><td>………</td><td>非顿报快改新</td></tr><tr><td>J</td><td>00000000</td><td>00………0J</td><td>晋1非顿报快改新</td></tr><tr><td>J</td><td>00000000</td><td>00………00</td><td>-0</td></tr><tr><td>W2</td><td>E</td><td>W</td><td>熟瑶</td></tr></table>

·阶码：是2n-1的移码， $\mathtt { E } =$ [E']移=2n-1+E'   
·隐藏位：单、双精度浮点数，尾数规格化的“1”，放置于整数位，并将其隐藏；临时实数无隐藏位  
■符号位：尾数的符号位Ms在最高位

<table><tr><td>类型</td><td>真值计算</td></tr><tr><td>单精度</td><td>规格化: \( \mathrm{N} = \left( {-1}\right) {}^{\mathrm{{Ms}} \times  }\left( {{1.}{\mathrm{M}}_{1}{\mathrm{M}}_{2}\cdots {\mathrm{M}}_{\mathrm{n}}}\right)  \times  {2}^{\mathrm{E} - {127}} \) 非规格化: \( \mathrm{N} = \left( {-1}\right) {}^{\mathrm{{Ms}} \times  }\left( {{0.}{\mathrm{M}}_{1}{\mathrm{M}}_{2}\cdots {\mathrm{M}}_{\mathrm{n}}}\right)  \times  {2}^{-{126}} \)</td></tr><tr><td>双精度</td><td>规格化: \( \mathrm{N} = \left( {-1}\right) {}^{\mathrm{{Ms}} \times  }\left( {{1.}{\mathrm{M}}_{1}{\mathrm{M}}_{2}\cdots {\mathrm{M}}_{\mathrm{n}}}\right)  \times  {2}^{\mathrm{E} - {1023}} \) 非规格化: \( \mathrm{N} = \left( {-1}\right) {}^{\mathrm{{Ms}} \times  }\left( {{0.}{\mathrm{M}}_{1}{\mathrm{M}}_{2}\cdots {\mathrm{M}}_{\mathrm{n}}}\right)  \times  {2}^{-{1022}} \)</td></tr></table>

例3.10若X和Y均是IEEE754标准的单精度浮点数。

（1）若× $=$ -135.625，求X的规格化浮点数表示。  
(2）若浮点数Y的存储形式为41360000H，求Y的真值。

（1）真值→IEEE754规格化单精度浮点数

$\textcircled{1}$ 写出数据的二进制真值 $\mathbf { x } =$ (-10000111.101） 2  
$\textcircled{2}$ 转换为M $\times 2 ^ {  E }$ 的形式：M' ${ \bf \delta } = \pm 1 . \times { \bf x } \ldots \times$ ，E'为整数

X=-1.0000111101×27 M'=-1.0000111101 E'=+7

： $\textcircled{3}$ 写出尾数M'的原码，尾数数值隐藏（舍去）整数位的“1"

$\boldsymbol { \ M } _ { S } = 1$ 尾数数值M $\mathtt { \mathtt { = 0 0 0 } }$ 0111 1010 0000 0000 0000

： $\textcircled{4}$ 写出阶码E'的移码E： $\mathsf { E } = [ \mathsf { E } ^ { \prime } ] _ { \scriptscriptstyle 1 \mathscr { B } } = 1 2 7 + \mathsf { E } ^ { \prime } = 1 2 7 + 7 = 1 3 4 = 1 0 0 ($ 00110B  
： $\textcircled{5}$ 按照格式排列E和M：即MsEM

$[ \mathsf { X } ] _ { \overrightarrow { \jmath } } = \uparrow$ 10000110 000 0111 1010 0000 0000 0000B=C307A000H

# 例3.10（2）浮点数 真值

# 阶码8位，2n-1的移码

$\textcircled{1}$ 浮点数的二进制编码：按照格式分，写出M、阶码E和尾数数值M

$$
\begin{array}{l} \cdot [ \mathrm {Y} ] _ {\text {浮}} = 4 1 3 6 0 0 0 0 \mathrm {H} = 0 1 0 0 / 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 B \\ \cdot \mathrm {M} _ {\mathrm {s}} = 0 \quad \mathrm {E} = 1 0 0 0 0 0 1 0 \mathrm {B} = 1 3 0 \quad \mathrm {M} = 0 1 1 0 1 1 0 0 0 0 0 0 0 \\ \end{array}
$$

添加隐 ·阶码编码E不是全0也不是全1，可判定Y是规格化浮点数

藏位1写出尾数的真值M’： $\pmb { M } _ { S } \mathbf { = } 0$ ，表明是正数添加隐藏位1

数符+

求出阶码的真值E'：Y是单精度浮点数，故E'=E-127=130-127=3

$$
\begin{array}{l} Y = M ^ {\prime} \times 2 ^ {E ^ {\prime}} = + 1. 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \times 2 ^ {3} \\ = + 1 0 1 1. 0 1 1 B = + 1 1. 3 7 5 \\ \end{array}
$$

但是，浮点数只能近似表示实数运算

1、向上舍入  
2、向下舍入  
3、向零舍入

4、四舍六入五取偶

Int ->float 同样 32 位不会发生溢出但是会失去精度

Int/float->double 不发生溢出，可以保留精度

Double->float float 数值更小会溢出；float 精度更小会舍入

Float 、double->int 1、向 0 舍入 2、发生溢出

![](images/bfa78e06b0d3913c28c391fec9983e9560c657cdba21f6186a404da3be4f5b19.jpg)

![](images/c18707fdc6690cbbeb12755c25664031e3864720f676bdd884409cae44b965d7.jpg)  
大端法与小端法

![](images/fc5f82e5e9be2a5c3b02fbe81cb70ad9ef2ad7623210873829e13a3b41d79e02.jpg)  
全加器

串行进位加法器（行波进位加法器）

![](images/97427437348e9fdabf7e1f1dd98d4ee87c5cacd20c88a229ec6fe0060a545d10.jpg)

先行进位加法器

乘法运算

除法运算

![](images/20dbaf06f5585bbdff9ba7e4458ceb025cb910d7536b1db144cebd7cca1b0b28.jpg)

 汉字输入：在西文标准键盘上，通过不同的字符组合，将汉字输入计算机，转换为汉字内码的过程  
 汉字输入码：也称外码，由不同的西文字符组合成的编码  
 汉字输入码种类：

数字编码：区位码、国标码、电报码等

拼音编码：搜狗拼音、微软拼音等

字形编码：五笔字型输入法、郑码

音形编码：自然码、钱码

汉字内码：用于汉字信息的存储、交换、检索等操作的机内代码

 一般采用两个字节表示，汉字内码在计算机中是唯一的  
 汉字内码涉及以下几种编码：  
 （1）区位码  
 汉字编码的国家标准：GB2312-1980《信息交换用汉字编码字符集·基本集》

 共收录了 6763 个汉字、682 个图形符号  
• 一级常用汉字：3755 个，按拼音字母顺序排列  
• 二级次常用汉字：3008 个，按偏旁部首排列  
 两个字节编码汉字，每个字节各取 7 位，可编码 $1 2 8 \times 1 2 8 = 1 6 3 8 4$ 个字符  
 将所有的汉字及符号组成一个 $9 4 \times 9 4$ 的方阵，行 “区”，列 “位”  
 每个汉字与符号都位于某个区的某个位上，区号和位号 “区位码”  
 例如：“中”字位于 54 区 48 位 “中”字的区位码即为“5448  （2）国标码  
 国标码 $\mid =$ 区位码 $+ 2 0 2 0 \mathsf { H }$ ，占用两个字节  
 例如“中”字：区位码 $\mathbf { = } 5 4 4 8$   
• 区码和位码转化为 16 进制， ${ \bf = 3 6 3 0 H }$   
• 国标码 $\lvert = 3 6 3 0 \rvert + 2 0 2 0 \ H = 5 6 5 0 \ H$   
 （3）汉字内码  
 西文字符：七位的 ASCII 码，当用一个字节表示时，最高位为“0”  
 汉字内码：汉字内码 $=$ 汉字国标码 $\pm 8 0 8 0 \mathsf { H }$ ，2 个字节的最高位均为“1”  
• 例如“中”字的机内码 $\lvert = 5 6 5 0 \rvert + 8 0 8 0 \ H = \mathrm { D } 6 \mathrm { D } 0 \mathsf { H }$   
 文本文件中储存的是汉字内码  
汉字处理系统中字形信息： $\textcircled{1}$ 用活字或文字版的母体字形形式； $\textcircled{2}$ 点阵表示法、  
矢量表示法等形式，最基本的，应用也最广泛的是字模码  
 字模码：用点阵形式表示与存储汉字字形代码，它是汉字的输出形式，用于汉字的显示和打印  
 根据汉字输出的要求不同，点阵的规模也不同：  
• 简易型汉字： $1 6 \times 1 6$ ， 32 字节/汉字  
• 普及型汉字： $2 4 \times 2 4$ ， 72 字节/汉字  
• 提高型汉字： $3 2 \times 3 2$ ，128 字节/汉字  
• 精密型汉字： $4 8 \times 4 8$ ，288 字节/汉字  
 汉字字库：将所有汉字的字模点阵代码按顺序集中存放，构成了汉字库  
 字形检索程序：将汉字的机内代码转化为汉字

# 补码加减

补码的加法运算公式：

$$
= [ X + Y ] _ {\text {补}} = [ X ] _ {\text {补}} + [ Y ] _ {\text {补}}
$$

补码的减法运算公式：

$$
\begin{array}{l} - [ X - Y ] _ {\text {补}} = [ X + (- Y) ] _ {\text {补}} \\ = [ \mathrm {X} ] _ {\text {补}} + [ - \mathrm {Y} ] _ {\text {补}} \\ \end{array}
$$

证明：

$$
[ X ] _ {\text {补}} = 2 ^ {n + 1} + X \quad (\mathrm {m o d} 2 ^ {n + 1})
$$

$$
[ Y ] _ {\text {补}} = 2 ^ {n + 1} + Y \quad (\mathrm {m o d} 2 ^ {n + 1})
$$

$$
\begin{array}{l} [ X ] _ {\text {补}} + [ Y ] _ {\text {补}} = 2 ^ {n + 1} + X + 2 ^ {n + 1} + Y \quad (\mathrm {m o d} 2 ^ {n + 1}) \\ = 2 ^ {n + 1} + (X + Y) \quad (\text {m o d} 2 ^ {n + 1}) \\ = [ X + Y ] _ {\text {补}} \quad (\mathrm {m o d} 2 ^ {n + 1}) \\ \end{array}
$$

任意两数之和的补码 $=$ 两数的补码之和  
任意两数之差的补码 $=$ 被减数的补码与减数相反数的补码之和

# 求补运算：[Y]补→[-Y]补

求补规则：将 $[ Y ] _ { \ast \mathrm { h } }$ 包括符号位在内每一位取反，末位加1。

若 $[ \boldsymbol { \Upsilon } _ { \sharp \flat } = \boldsymbol { \Upsilon } _ { \mathsf { s } }$ $\mathsf { Y } _ { 1 } . . . . . \mathsf { Y } _ { \mathsf { n } }$ ，则：

$$
- [ - Y ] _ {\text {补}} = \overline {{Y _ {S}}} \overline {{Y _ {1}}} \dots \dots \overline {{Y _ {n}}} + 1
$$

若[Y]补 $\mathbf { \Psi } = \mathsf { Y } _ { \mathsf { S } } . \mathsf { Y } _ { 1 } . . . . . \mathsf { Y } _ { \mathsf { n } }$ ，则：

$$
- [ - Y ] _ {\text {补}} = \overline {{Y _ {S}}} \overline {{Y _ {1}}} \dots \dots \overline {{Y _ {n}}} + 0. 0 \dots \dots 0 1
$$

：溢出：运算结果超出机器数的表示范围

计算机硬件必须具备：

·能够检测运算结果是否发生溢出；  
·能够指示运算结果是否发生溢出；

补码加减运算判溢方法：

·单符号位判溢   
·进位判溢   
■双符号位判溢

对于加减运算，可能发生溢出的情况：

■同号（两数）相加  
·异号（两数）相减

Why?

一定会发生溢出的情况：

正数相加，且运算结果符号位为1   
·负数相加，且运算结果符号位为0   
·正数－负数，且运算结果符号位为1   
■负数－正数，且运算结果符号位为0

# 18

# （1）单符号位判溢方法

$\overline { { A D D } } / S U B = 0$ ：做加法

$\overline { { A D D } } / S U B = 1$ ：做减法

【例4.3】的4种情况：

$$
\begin{array}{l} [ \mathrm {X} ] _ {\text {补}} = \mathrm {X} _ {S} \mathrm {X} _ {1} \dots \dots \mathrm {X} _ {n} \\ [ \mathrm {Y} ] _ {\text {补}} = \mathrm {Y} _ {S} \mathrm {Y} _ {1} \dots \dots \mathrm {Y} _ {n} \\ [ X \pm Y ] _ {\text {补}} = F _ {s} F _ {1} \dots \dots F _ {n} \\ \end{array}
$$

<table><tr><td>运算</td><td>操作数X</td><td>XS</td><td>操作数Y</td><td>YS</td><td>运算结果F</td><td>FS</td><td>溢出情况</td></tr><tr><td>X+Y</td><td>正数</td><td>0</td><td>正数</td><td>0</td><td>负数</td><td>1</td><td>正溢出</td></tr><tr><td>X+Y</td><td>负数</td><td>1</td><td>负数</td><td>1</td><td>正数</td><td>0</td><td>负溢出</td></tr><tr><td>X-Y</td><td>正数</td><td>0</td><td>负数</td><td>1</td><td>负数</td><td>1</td><td>正溢出</td></tr><tr><td>X-Y</td><td>负数</td><td>1</td><td>正数</td><td>0</td><td>正数</td><td>0</td><td>负溢出</td></tr></table>

$\boldsymbol { \mathsf { V } } = \boldsymbol { \mathsf { 1 } }$ ：溢出

# （3）双符号位判溢方法

·X和Y采用双符号位补码参加运算，正数的双符号位为00，负数的双符号位为11；当运算结果的两位符号Fs1 $\bar { \mathsf { F } } _ { 5 2 }$ 不同时（01或10），发生溢出。

$$
\frac {\mathrm {X} _ {\mathrm {S}} \mathrm {X} _ {\mathrm {S}} \mathrm {X} _ {1} \mathrm {X} _ {2} \dots \dots \mathrm {X} _ {\mathrm {n}}}{\mathrm {Y} _ {\mathrm {S}} \mathrm {Y} _ {\mathrm {S}} \mathrm {Y} _ {1} \mathrm {Y} _ {2} \dots \dots \mathrm {Y} _ {\mathrm {n}}}
$$

$$
\begin{array}{r l} & \mathrm {X} _ {\mathrm {S}} \mathrm {X} _ {1} \mathrm {X} _ {2} \dots \dots \mathrm {X} _ {\mathrm {n}} \\ + & \mathrm {Y} _ {\mathrm {S}} \mathrm {Y} _ {1} \mathrm {Y} _ {2} \dots \dots \mathrm {Y} _ {\mathrm {n}} \\ \hline & \mathrm {F} _ {\mathrm {S}} \mathrm {F} _ {1} \mathrm {F} _ {2} \dots \dots \mathrm {F} _ {\mathrm {n}} \end{array} \quad \begin{array}{r l} & \mathrm {F} _ {\mathrm {S} 1} = \mathrm {X} _ {\mathrm {S}} \oplus \mathrm {Y} _ {\mathrm {S}} \oplus \mathrm {C} _ {\mathrm {S}} \\ & \mathrm {F} _ {\mathrm {S} 2} = \mathrm {F} _ {\mathrm {S}} \end{array}
$$

$$
\begin{array}{l} \mathbf {V} = \mathbf {F} _ {\mathbf {S} 1} \oplus \mathbf {F} _ {\mathbf {S} 2} \\ \cdot \mathbf {V} = \mathbf {F} _ {\mathbf {S} 1} \oplus \mathbf {F} _ {\mathbf {S} 2} = \mathbf {X} _ {\mathbf {S}} \oplus \mathbf {Y} _ {\mathbf {S}} \oplus \mathbf {C} _ {\mathbf {S}} \oplus \mathbf {F} _ {\mathbf {S}} \\ \end{array}
$$

=Fs1 $\bar { \mathsf { F } } _ { S 2 } = 0 1$ ，则正溢出； $\bar { \mathsf { F } } _ { 5 1 } \mathsf { F } _ { 5 2 } = 1 0$ ，则负溢出。

核心部件：一个普通的二进制并行加法器。

A:累加器，存放[X]补   
B:寄存器，存放 $[ \boldsymbol { \mathsf { Y } } ] _ { \sharp \flat }$

取反电路：

·控制信号P $\cdot = 1$ ，取反电路工作；$\mathsf { P } \mathsf { = } \mathsf { 0 }$ ：不工作 (不取反)  
· P= ADD/SUB

![](images/ae54ce06282a8e6bd6869a6dae889b392853294a3eb61a65b62d54b612cdaac3.jpg)

# 工作原理：

- ADD/SUB ${ \tt = } 0$ ：补码加法器，B寄存器→并行加法器 $[ \mathsf { P } \mathsf { \tau } ] = \mathsf { 0 } ]$   
·ADD/SUB=1:补码减法器，B取反→并行加法器（ $\scriptstyle \mathbf { P } = 1$ ），且并行加法器

的最低位的进位-1 即R取反加1：相当干rY1..加r-V1.. →减法运算

![](images/d9d5837f8365fb673cb70ee9ba3a74bd16f123df640119ed41a51adfb2ae366a.jpg)

# 乘法实现

![](images/4e246a115c30e7de0c4f12d19cb99bf90bc9cd7e8afda36ca1d83dca0bfc5c41.jpg)

# 昇法少骤

X [X]原=Xs X, Xx....Xn   
[Y]原=Ys Y, Y....Yn   
： $\mathbf { P } { = } \mathbf { X } { \cdot } \mathbf { Y }$ ，Ps是积的符号

$\textcircled{1}$ 符号位单独处理 Ps=Xs Ys  
$\textcircled{2}$ 绝对值进行数值运算|P|=|X|*|Y|   
$\textcircled{3}$ 初始部分积为0，从乘数最低位开始累加、右移： $\yen 123$ ，部分积加|X|， $\scriptstyle \pmb { \ Y } _ { \mathbf { l } = \mathbf { 0 } }$ 部分积加0，累加结果右移一位，得新部分积。  
$\textcircled{4}$ 累加右移n次，即 $\mathbf { \beta } = \mathbf { n }$

![](images/cae87f09a7a831e5a8b40bbdeee629097938a3a1a74a22e443e586a8ee6afeb5.jpg)

![](images/e9f01da7655ec11fc4a057bacb897b4b59ba6b38198840dcaf3782c713afc75c.jpg)

![](images/c9d69a7ab9cac99299f1038b5f374410d4c9dd5a62edfb63afd19f1e01341604.jpg)

# 控制逻辑电路

$\scriptstyle \mathbf { Q } _ { n } = \mathbf { 0 }$ : +0 (0...0&B)   
$\scriptstyle \mathbf { Q } _ { n } = 1$ : +|X| (11...1&B)

![](images/55167d2f731515103cb555f2a8a983360cf03536b770a98fecac758e276be506.jpg)

# 3、原码乘法的硬件实现

A:累加寄存器  
B:被乘数寄存器  
Q:乘数寄存器  
桶形移位器：F、Q联合逻辑右移

A-{C，F.F1)Q-{Fn1)

![](images/50c123f3e8175837087fdfcd305333c9c9036c5008f2054a02668e8566c45fd6.jpg)

# 初始：

A=0   
B=|X|   
Q=IYI   
计数器=n

# 累加、右移n次

![](images/cee718a471c69c493caac3a6ae32770ed50a1dfbd57d645b620c0ef6a559157a.jpg)

# 结果：

A=乘积绝对值高位  
B =｜X)   
$\pmb { \mathrm { Q } } =$ 乘积绝对值低位  
计数器 $\mathtt { \mathtt { = 0 } }$

![](images/35618de2ffe45452a153e0af96cb4963364157976dd9ea747ea1ac8ccbe444b9.jpg)

# 原码一位乘法流程：

![](images/0c453e8e70a0be8534b121ac4c245278583c49001e1d8fb673fd9262cba1b395.jpg)

![](images/a36d031b37fdd38c2990cb53473d9ab5f781d7bc3d220d4963c8e5341bc4d63e.jpg)

# 除法

X=+0.1011，Y=-0.1101，求X÷Y

# 手工除法：

·判断被除数是否大于除数，决定商0/1。  
■若商1，则减除数（得部分余数），再添加一位数或者添加0  
·若商0，则直接添加一位数或者添加0

# 改进手工算法 适合机器运算：

·计算机通过做减法测试来实现判断：结果大于等于0，表明够商1；结果小于0，表明不够减，商0。  
■计算机将部分余数左移一位，再直接与不右移的除数相减。

# 即：减（+除数相反数的补码）

左移，构成循环

![](images/080881940dddf1c0a012c30525b5c825fe4016a68c3cf727c989870893f7a3b6.jpg)

![](images/bc67a26ef8c12a855344bd8b9a0214ec1762b77d8e934cbed0ba98eaad5f8e08.jpg)

![](images/f60008b096af71284ca25b36cf55312ff0d5181018ae1d26bb5b13719529cfef.jpg)

![](images/913d33a05eded314c13c28fbf1daa186986245ed66e8eb12b6d67956866f8a7e.jpg)

# 不恢复余数算法

又称为加减交替法：当不够减时，不恢复余数，用加上除数（+IYI）的办法来继续求下一位商，其他操作不变。  
加减交替法的规则如下：

余数为正：商上1，求下一位商的办法，是余数左移一位，再减去除数；  
余数为负：商上0，求下一位商的办法，是余数左移一位，再加上除数。  
若最后一次上商为0，而又需得到正确余数，则最后一次仍需恢复余数。

"Why?

![](images/52d547c67d42a9203c76f16d5b457286133f23e717cfb269e410a277f0f94a48.jpg)

![](images/1635b02d62a20c8866fd2f847b7be51a7eb63e2baf3207aed8f554ea8f18d46a.jpg)

： $\textcircled{1}$ 如何控制加减交替？  
： $\textcircled{2}$ 如何上商？  
$\textcircled{3}$ 加减与移位次数如何控制，结果在哪里？  
$\textcircled{1}$ 加减交替：控制逻辑

$\scriptstyle \mathbf { Q } _ { \mathrm { n } } = 1$ 表明够减一下一次做减法→B中的|Y|取反（11...11B)  
$\scriptstyle \mathbf { Q } _ { \mathrm { n } } = \mathbf { 0 }$ 表明不够减一下一次做加法→B中的|Y|不取反 (0...00B)

# $\textcircled{2}$ 上商：Fs取反

·Fs=0表明够减 $\scriptstyle  \mathbf { Q } _ { \mathsf { n } } =$   
$\bar { \mathsf { F } } _ { \mathsf { S } } \mathsf { = }$ 1表明不够减 →Qn=0

![](images/3f2316993b77cc87c3b76fb52c1b9a866d3d27a79298726c073a1420897aecdd.jpg)

# 构成：

内部总线IB  
· ALU   
·2个暂存器：LA和LB   
·通用寄存器堆GPR：n+1个

![](images/e985aecc3e9eb9e76340b5366b6fa387f7ab170ac283a9cc5778b77f921838fd.jpg)

· $\mathrm { L A } _ { \mathrm { i n } } = 1$ ：IB上数据写入LA   
： $\mathsf { L B } _ { \mathrm { i n } } = 1$ :IB上数据写入LB  
ALUOP：功能码/运算码，选择ALU执行的运算  
$\mathtt { A L U } _ { \mathrm { o u t } } = \mathbb { 1 }$ ：ALU的运算结果（即输出端F）→IB

RA：执行读操作的寄存器地址   
WA：执行写操作的寄存器地址   
$\mathtt { G R } _ { \mathtt { o u t } } = 1$ ：读出RA指定的寄存器数据送到IB上(Reg[RA]→IB)  
$\mathsf { G R } _ { \mathrm { i n } } = 1$ ：将IB上的数据写入由写地址WA选中的寄存器 (IB→Reg[WA])

$\gtrdot$ 数据通路：指数据在硬件系上流动的过程与控制步骤

![](images/125f1f976a45bde61707512608d443be1397a84c51bebbeef84d0565bd4ae8b7.jpg)

在总线上传送数据的数据通路：需要一个CPU周期

源部件将数据送上总线；目的部件从总线上接收数据  
任何要把数据送上总线的源部件，其数据输出端必须以三态输出的形式与总线连接，并由使能信号控制  
·对于某个总线系统来说，各个总线源部件的数据输出使能信号不能同时有效：任何时刻只能允许一个部件将数据送上总线以保证分时高用总线

![](images/8c546a5f5a7aab5fcbb5bf8368f8ffbbd6e20baab9c2b514f1bcfa342a332678.jpg)

【例4.10】假设在单总线运算器中，完成一条指令ADDR，R作 $\mathbb { R } _ { 2 } + \mathbb { R } _ { 7 }  \mathbb { R } _ { 3 }$ ，则分析该操作的数据通路，需要几个CPU周期？

![](images/8195232877e38e022ce58354bf3e0f8e7017782e37ce393611d5c1f08bbd1c6a.jpg)

需要

<table><tr><td>步骤</td><td>操作</td><td>发送的信号</td></tr><tr><td>1</td><td>R2→LA</td><td>RA=2, GRout=1, LAin=1</td></tr><tr><td>2</td><td>R7→LB</td><td>RA=7, GRout=1, LBin=1</td></tr><tr><td>3</td><td>ALU执行F=A+B运算，结果F→R3</td><td>ALU_OP=加法功能码，ALU_out=1,</td></tr></table>

![](images/d814906f52ca58133470d1ec963e40201e7792ebe345adbefb39a1651947d1be.jpg)

X 【例4.10】假设在单总线运算器中，完成一条指令ADD $\pmb { \mathsf { R } } _ { 3 }$ ${ \sf R } _ { 2 }$ ，R的运算操$\mathsf { E R } _ { 2 } + \mathsf { R } _ { 7 } \to \mathsf { R } _ { 3 }$ ，则分析该操作的数据通路，需要几个CPU周期？

![](images/a7fb5924317ec14cc0f9c5e3f8fb93545692880d72c48a901eeeba9aab0db9c9.jpg)

<table><tr><td>步骤</td><td>操作</td><td>发送的信号</td></tr><tr><td>1</td><td>R2→LA</td><td>RA=2, GRout=1, LAin=1</td></tr><tr><td>2</td><td>R7→LB</td><td>RA=7, GRout=1, LBin=1</td></tr><tr><td>3</td><td>ALU执行F=A+B运算,结果F→R3</td><td>ALU_OP=加法功能码, ALU_out=1, GRin=1, WA=3</td></tr></table>

需要3个CPU周期

![](images/1ea251a75cc631e8da1edd057cec79441fb72193971d3eef097821a86412e2de.jpg)

# 构成：

·2条内部总线：IB1、IB2   
· ALU   
·暂存器：LC   
·通用寄存器堆GPR：n+1个

![](images/a87051a1213d96b6ac50fd128c53e03bcfdec6caf2a3592e7cd20df2d14f35b1.jpg)

： $\iota C _ { \mathrm { i n } } = 1$ ：ALU运算结果写入LC，即F→LC  
$\dot { } \cdot \mathsf { L C } _ { \mathsf { o u t } } = 1$ ：LC中数据送上总线IB1，即LC→IB1  
$\ast$ ALU_OP:ALU功能码/运算码  
$\ast$ RA1：执行读出数据到IB1的寄存器地址  
$\ast$ RA2：执行读出数据到IB2的寄存器地址  
$^ \ast$ WA：执行写操作的寄存器地址

$\mathsf { G R } _ { \mathsf { o u t 1 } } = 1$ ：读出RA1指定的寄存器数据送到IB1上，即Reg[RA1]→IB1  
$\mathsf { G R } _ { \mathsf { o u t } 2 } = 1$ ：读出RA2指定的寄存器数据送到IB2上，即Reg[RA2]→IB2  
$\mathsf { G R } _ { \mathrm { i n } } = 1$ ：将IB1上的数据写入由写地址WA中的寄存器，即IB1→Reg[WA]

![](images/75625929eabda9a925a66bd9baf77befd3d36f41294bd86703c1f96680c42d1e.jpg)

# （2）双总线结构

【例4.11】假设在双总线运算器中，同样完成指令ADD ${ \sf R } _ { 3 }$ $\mathsf { R } _ { 2 }$ $\mathsf { R } _ { 7 }$ 的运算操作 $R _ { 2 } + R _ { 7 }  R _ { 3 }$ ，分析数据通路，需要几个CPU周期？  
需要2个CPU周期

![](images/2f5b4666b8610e3c937ac6d9db58dffad8bf5997aa2c849c2a86b02e3a84305b.jpg)

<table><tr><td>步骤</td><td>操作</td><td>发送的信号</td></tr><tr><td>1</td><td>R2→IB1, R7→IB2, F=A+B, F→LC</td><td>RA1=2, RA2=7, ALU_OP=加法功能码,GRout1=1, GRout2=1, LCin=1</td></tr><tr><td>2</td><td>LC→R3</td><td>LCout=1, GRin=1, WA=3</td></tr></table>

思考：如果LC暂存器输出端连接到IB2上，能否完成上述操作？  
总结：在分析总线结构的运算器数据通路时，基本的原则：在一个CPU周期内，某条总线上的数据必须是唯一的，且不能保留至下一个CPU周期。

特征：按照运算操作的过程与控制需求，部件之间由专用的独立线路进行连接  
特点：线路比较复杂，但是传输效率高，适用于流水线CPU

![](images/a7e3272769accbdabd6a76fd92b15f114f238570452f7eb9ae49f9f25ff03f10.jpg)  
单周期CPU的运算器  
每条指令只需一个CPU周期完成

![](images/dd24d6faebf55dcbf9ad5485c350bf3bc364b5b8f7b499d47a4200f6e1f95dd1.jpg)  
多周期CPU的运算器  
每条指令需要多个CPU周期完成

![](images/314d6cadb0bfe6466e978c155fecfc534eaf9f467fd04c79c80fc0bce91e1af4.jpg)  
单周期CPU的运算器

·只需1个clk周期：

RAA=2,RBA=7,WA=3   
·ALU_OP=加法功能码  
·Reg_W=1，在clk的边沿完成R2+R→R3操作

![](images/2a77f41d31aa31d653f723077162ad45fbdb4b02309f3ee781bfbda011629076.jpg)  
执行ADD R3,

需3个节拍（clk周期）：

·第1个clk（读寄存器）： $\mathsf { R } _ { 2 } { \longrightarrow } \mathsf { A }$ $\scriptstyle \mathsf { R } _ { 7 } \to \mathsf { B }$ :RAA $^ { 1 = 2 }$ RB A=7  
·第2个clk（执行）：A+B→F:ALU_OP=加法功能码  
·第3个clk（写回）： $\mathsf { F } {  } \mathsf { R } _ { 3 }$ :WA $^ { = 3 }$ ，Reg_W=1

![](images/59c466468b213ccd281befcd1eebfaec5971995dd519d811b30d31d64f190ad7.jpg)

# 特征：能够对一组寄存器同时读出或者写入多个数据

# 三端口寄存器堆可以同时进行

·读A端口  
读B端口  
·写入数据

# 寄存器堆：4×8位

$\mathbb { R } _ { 0 } \sim \mathbb { R } _ { 3 } ,$ ，地址2位  
·RA_A:A口地址   
·RA_D:A口读出数据   
RB_A:B口地址  
RB_D:B口读出数据

![](images/7f04dad3f2cd8523941ddb3b2e5073b147d88189f7b4c6de8b40c926dd617f13.jpg)

# 标志寄存器FR：又称为状态寄存器

# PSW:程序状态字

■用来保存ALU操作结果的某些状态，可作为外界对运算结果进行分析的依据，也可以用于判断程序是否要转移的条件

# 最基本的5种运算结果标志：

$\textcircled{1}$ ZF：结果为零标志

·运算结果为全0，ZF置1

$$
Z F = \overline {{F _ {n} + F _ {n - 1} + . . . . . . + F _ {0}}}
$$

·运算结果不全为0，ZF置0

$\textcircled{2}$ CF：进位/借位标志位，CF标志只对无符号数运算有意义

·加法运算时：C=1则CF置1（表示有进位），否则置0  
·减法运算时： $\subset = \pmb { 0 }$ 则CF置1（表示不够减，有借位），否则置0

最高位的进位

$$
C F = \overline {{\overline {{A D D}} / S U B}} \cdot C + \overline {{A D D}} / S U B \cdot \overline {{C}}
$$

![](images/131355cd6254e9395745464151013638000f1f37cc5df5cc5192d7004b5949af.jpg)

③UF：溢出标志，反映有符亏数加减运算所得结果是否溢出；UF标志只对带

符号数运算有意义。

·运算溢出：OF=1   
·运算没有溢出：OF $\mathtt { \mathtt { \mathtt { = 0 } } }$

$$
\begin{array}{c c} O F = \overline {{A D D / S U B}} \left(\overline {{X _ {S}}} \overline {{Y _ {S}}} F _ {S} + X _ {S} Y _ {S} \overline {{F _ {S}}}\right) \\ + \overline {{A D D}} / S U B \left(\overline {{X _ {S}}} Y _ {S} F _ {S} + X _ {S} \overline {{Y _ {S}}} \overline {{F _ {S}}}\right) \\ \hline O F = C _ {1} \oplus C _ {S} & O F = F _ {S 1} \oplus F _ {S 2} \end{array}
$$

$\textcircled{4}$ SF：符号标志，记录运算结果的符号。

·为运算结果的最高位 SF =Fn   
·运算结果为正数时： $\pmb { S F = 0 }$ ；为负数时： $s F { = } 1$ 。 (无溢出时才正确)

$\textcircled{5}$ PF：奇偶标志，反映运算结果中“1”的个数的奇偶性

·结果中“1”的个数为偶数：PF=1   
·结果中“1”的个数为奇数：PF=0

$$
P F = \overline {{F _ {n} \oplus F _ {n - 1} \oplus \dots . \oplus F _ {0}}}
$$

# 假设两个浮点数X和Y

$$
X = M _ {X} \times 2 ^ {E _ {X}}
$$

$$
Y = M _ {Y} \times 2 ^ {E _ {Y}}
$$

对齐小数点：使得阶码小的那个数变得与阶码大的那个数的阶码  
然后：对尾数（有效数位）做加减运算

$$
Z = X \pm Y = \left(M _ {X} \cdot 2 ^ {\left(E _ {X} - E _ {Y}\right)} \pm M _ {Y}\right) \times 2 ^ {E _ {Y}} \quad E _ {X} \leq
$$

(2）对阶：

目标是：对齐小数点  
原则是：小阶对大阶

求阶差△E=Ex-Eγ，若△E≠0，即Ex≠E时需要对阶。  
若△E>0，则Ex>Eγ，M每右移一位， $\mathbb { E } _ { \mathsf { Y } ^ { + } }$ 1，直至 $\mathsf { E } _ { \mathsf { v } } = \mathsf { E } _ { \mathsf { X } }$   
若△E<0，则 $\mathsf { E } _ { \mathsf { X } } { < } \mathsf { E } _ { \mathsf { Y } }$ $\pmb { M } _ { \mathbf { X } }$ 每右移一位， $\mathtt { E _ { X } } + 1$ ，直至 $\therefore x = E _ { y }$

(3）尾数相加减

·若做减法，先将操作数Y的尾数取相反数，再与Y的尾数相加   
■对阶时，右移多出的数位不丢弃（因为一般设置位数更宽的ALU进行计算，同时设置更宽的寄存器来存放中间运算结果)

82

# 浮点加减运算步骤

【4）结果规格化：尾数运算的结果可能出现两种非规格化情况：

·尾数溢出：需要右规（1次），即尾数右移1位，阶码+1  
尾数| $< 2 ^ { - 1 }$ ：需要左规，即尾数左移1位，阶码-1，左规可能多次，直到尾数变为规格化形式。  
·先判断是否溢出，如果没有，再判断是否有前导零

[5）舍入：将尾数多余的位数舍去，变成规定的浮点数格式  
舍入策略：舍去多余位数的方法，简单的舍入策略：

·截断法：多余的全舍去   
·0舍1入法：多余位的最高位为1时，在尾数最低位上+1，否则舍去多余位  
·末位恒置1：始终在舍入结果的最末位置1

# IEEE754标准：规定了4种可选的舍入模式

$\textcircled{1}$ 向上舍入（总是朝+）：为正数时，只要多余位不全为0，就向最低有效位进1；为负数时，则采用简单的截断法  
$\textcircled{2}$ 向下舍入（总是朝－）：为正数时，只要多余位不全为0，就简单地截尾为负数时，则向最低有效位进1  
$\textcircled{3}$ 向0舍入：即朝数轴的原点方向舍入，就是无论正数还是负数，都采用简单的截尾，从而使得绝对值总是变小。这种方法容易累积误差  
$\textcircled{4}$ 就近舍入：即舍入到最接近的数，“四舍五入”。多余位=R,...Rn

·当R $\scriptstyle 1 = 0$ ：截尾（即舍去）；  
·当R $_ 1 = 1$ ,且R...R不全为0：向最低有效位进1；  
· $\yen 123,456,7$ ：即等于一半（中点），则若最低有效位为0就截尾，若最低有效位为1就进1，以使得最低有效位总是为0

中间结果设置了：保护位(guard)、舍入位(round)、粘滞位(sticky)

![](images/55a92cad7bcb03d99177cc82bcc618a4c22ad6fac867143503578508456fb4c6.jpg)

![](images/7749aefff1f44fe5f12bbb0be1645640461baee14490e7fc1b26359b4e945f52.jpg)

![](images/5f43ed1e5bce18a593cd23ba0865b39f93ba309eb7af27bdb85047d14e10b90e.jpg)

# 浮点加减运算例题

# (2）尾数相加：

$$
\left[ \mathrm {M} _ {2} \right] _ {\text {补}} = 1. 1 0 0 0 0 0 1 (1 0 1)
$$

$$
[ \mathrm {M} _ {\mathrm {X}} ] _ {\text {补}} 1 1. 0 1 1 0 1 0 1
$$

$$
+ \left[ \mathbf {M} _ {\mathbf {Y}} \right] _ {\text {补}} 0 0. 0 0 0 1 1 0 0 (1 0 1)
$$

$$
\left[ \mathbf {M} _ {\mathrm {X}} + \mathbf {M} _ {\mathrm {Y}} \right] _ {\text {补}} 1 1. 1 0 0 0 0 0 1 (1 0 1)
$$

（3）结果规格化：首先判断：是否溢出？

因为双符号位为11，没有溢出

再检查：有无前导零？

因为 $\boldsymbol { \mathsf { M } } _ { \mathrm { Z } } \boldsymbol { \mathrm { l } } _ { * \mathrm { f } }$ 符号位和最高有效位相同 $= 1 . 1$ 故有一个前导零，须左规一位

左规一位：尾数左移1位，阶码-1

$[ \mathbf { M } _ { 2 } ] _ { * \mathrm { h } } = 1 . 0 0 0 0 0 1 1$ (01)   
$[ \ E _ { \mathrm { Z } } ] _ { * \mathrm { h } } = 0 0$ ，001 + 11, $1 1 1 = 0 0$ ，000

# (4）舍入：按照0舍1入法，尾数多余位舍去

结果为： $[ \mathsf { X } + \mathsf { Y } ] _ { \dag \Xi } = 0$ ，000 1.0000011

![](images/cd1e8e31644d4311c85ff19418a4b8474f57ffd8021141b8b4cc57db704dfb8a.jpg)

![](images/3696e23690406c549b23470efcee5693b5f60e0db09eef2133e90f7a62811e0a.jpg)