计算机组成原理--补码
补码定义
设模为M,一个数 X 补码的一般定义为:[ X ]补 = M+X
定点小数补码定义: $$ \left[ X \right]_{\text{补}} = \begin{cases} X = \left[ X \right]_{\text{原}} & \quad 0 \leq X < 1 \\\\ 2 + X = 2 - \left| X \right| & \quad -1 \leq X < 0 \end{cases} \quad \text{MOD 2} $$ 定点整数补码定义: $$ \left[ X \right]_{\text{补}} = \begin{cases} X = \left[ X \right]_{\text{原}} & \quad 0 \leq X < 2^{n-1} \\\\ 2^n + X = 2^n - \left| X \right| & \quad -2^{n-1} \leq X < 0 \end{cases} \quad \text{MOD } 2^n $$
补码的性质
① 补码的符号位: 用补码表示的数,若其最高位为0,则此数为正;若其最高位为1,则此数为负。
② 补码中0的表示: 0的补码是惟一的。 $$[0]_{\text{补}} = \underbrace{000\cdots000}_{n\text{ 位}} = [0]_{\text{反}} = [0]_{\text{原}}$$
③ 补码的真值表示范围:假设机器字长为n,则
Ⅰ) 用补码表示的定点小数,其真值表示范围为:\(-1 \le X \le +\left(1 - 2^{-(n-1)}\right)\) ;
最大正定点小数:
$$ \begin{align*}
[0. \underbrace{111\cdots1}_{n-1\text{ 位}}]_{\text{补}}
&= [0. \underbrace{111\cdots1}_{n-1\text{ 位}}]_{\text{原}} \\
&= 0 \cdot 2^0 + 1 \cdot 2^{-1} + 1 \cdot 2^{-2} \cdots 1 \cdot 2^{-(n-1)} \\
&= 2^{-1} \frac{1 - 2^{-1\cdot(n-1)}}{1 - 2^{-1}} \quad (等比求和) \\
&= 1 - 2^{-(n-1)}\\
\end{align*}
$$
最小负定点小数:\( [1. \underbrace{000\cdots0}_{n-1\text{ 位}}]_{\text{补}} = -1 \)
补码(二进制) | 十进制值(真值) |
---|---|
0000 0000 | 0.0000 = 0 |
0000 0001 | 0.0078125 |
0000 0010 | 0.015625 |
0000 0011 | 0.0234375 |
... | ... |
0111 1111 | 0.9921875 |
1000 0000 | -1 |
1000 0001 | −0.9921875 |
1000 0010 | −0.984375 |
... | ... |
1111 1111 | −0.0078125 |
最大正定点整数: $$ \begin{align*} [0,\underbrace{111\cdots1}_{n-1\text{ 位}}]_{\text{补}} &= [0,\underbrace{111\cdots1}_{n-1\text{ 位}}]_{\text{原}} \\ &= 2^{n-1} - 1 \\ \end{align*} $$ 最小负定点整数: \( [1, \underbrace{000\cdots0}_{n-1\text{ 位}}]_{\text{补}} = -2^{n-1} \)
真值 x | X的原码 表示 [X] 原 |
X的补码 表示 [X] 补 |
X的反码 表示 [X] 反 |
X的移码 表示 [X] 移 |
|
---|---|---|---|---|---|
十进制 表示 |
二进制 表示 |
||||
+127 | +0111 1111 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 |
+126 | +0111 1110 | 0111 1110 | 0111 1110 | 0111 1110 | 1111 1110 |
…… | …… | …… | …… | …… | …… |
+2 | +0000 0010 | 0000 0010 | 0000 0010 | 0000 0010 | 1000 0010 |
+1 | +0000 0001 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 |
0 | 0000 0000 | 0000 0000 1000 0000 | 0000 0000 | 0000 0000 1111 1111 | 1000 0000 |
−1 | −0000 0001 | 1000 0001 | 1111 1111 | 1111 1110 | 0111 1111 |
−2 | −0000 0010 | 1000 0010 | 1111 1110 | 1111 1101 | 0111 1110 |
…… | …… | …… | …… | …… | …… |
−126 | −0111 1110 | 1111 1110 | 1000 0010 | 1000 0001 | 0000 0010 |
−127 | −0111 1111 | 1111 1111 | 1000 0001 | 1000 0000 | 0000 0001 |
−128 | −1000 0000 | 无法表示 | 1000 0000 | 无法表示 | 0000 0000 |
④ 负数的补码值大于正数的补码值
⑤ 补码与真值,原码之间的相互转换: "按位取反,末位加1"
Ⅰ) 当\( X \geq 0\)时, \( X = [X]_{\text{原}} = [X]_{\text{补}} \)
Ⅱ) ⓐ当\( X \lt 0\)时,假设机器字长为n, 由定义得:
$$
\begin{align*}
{[X]}_{\text{补}} &= 2+X \\
&= \underbrace{1.11\cdots\cdots 1}_{n \text{个}1} + X + \underbrace{0.00\cdots\cdots 0}_{n-1 \text{个}0}1 \\
&= \underbrace{1.11\cdots\cdots 1 - |X|}_{|X|\text{按位取反}} + \underbrace{0.00\cdots\cdots 01}_{\text{末位加}1}
\end{align*}
$$
ⓑ当\( X \lt 0\)时,假设机器字长为n, 由定义得:
$$
\begin{align*}
|X| &= -X \\
&= 2 - [X]_{\text{补}} \\
&= \underbrace{1.11\cdots\cdots 1 - [X]_{\text{补}} }_{[X]_{\text{补}}\text{按位取反}} + \underbrace{0.00 \cdots\cdots 01}_{\text{末位加}1} \\
\end{align*}
$$
⑥补码的符号位扩展
Ⅰ) 定点小数: 在其低位填充适当位数的0
Ⅱ) 定点整数:符号位扩展
⑦补码的算数右移(除2运算)
⑧补码的算数左移(乘2运算)