计算机组成原理--补码

Date: . Last updated: .

补码定义

设模为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 \)

机器字长为8位,定点小数补码表
补码(二进制) 十进制值(真值)
0000 00000.0000 = 0
0000 00010.0078125
0000 00100.015625
0000 00110.0234375
......
0111 11110.9921875
1000 0000-1
1000 0001−0.9921875
1000 0010−0.984375
......
1111 1111−0.0078125
Ⅱ) 用补码表示的定点整数,其真值表示范围为:\(-2^{n-1} \le X \le +\left(2^{n-1} - 1\right)\)。
最大正定点整数: $$ \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} \)

机器字长为8位,定点整数补码表
真值 x X的原码
表示 [X] 原
X的补码
表示 [X] 补
X的反码
表示 [X] 反
X的移码
表示 [X] 移
十进制
表示
二进制
表示
+127+0111 11110111 11110111 11110111 11111111 1111
+126+0111 11100111 11100111 11100111 11101111 1110
………………………………
+2+0000 00100000 00100000 00100000 00101000 0010
+1+0000 00010000 00010000 00010000 00011000 0001
00000 00000000 0000
1000 0000
0000 00000000 0000
1111 1111
1000 0000
−1−0000 00011000 00011111 11111111 11100111 1111
−2−0000 00101000 00101111 11101111 11010111 1110
………………………………
−126−0111 11101111 11101000 00101000 00010000 0010
−127−0111 11111111 11111000 00011000 00000000 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运算)