计算机原码、反码和补码

时间长了,在上计算机组成原理时,发现这部分的知识又遗忘了。所以还是整理以下,方便以后可以即时回顾,就不用去翻书了。

1、原码

用原码表示带符号的二进制数时,符号位用 0 表示正,1 表示负;数值位保持不变。原码表示法又称为符号-数值表示法。

1.1 小数原码的定义

设二进制小数 \(X = \pm 0.x_{-1}x_{-2}...x_{-m}\),则其原码定义为

\[ [X]_{原} = \left\{ \begin{matrix} \begin{align*} &X & 0 \leqslant X < 1 \\ &1 - X & -1 < X \leqslant 0 \end{align*} \end{matrix} \right. \]

\(X_1 = +0.1011, X_2 = -0.1011\),求 \(X_1\)\(X_2\) 的原码。

\[ \begin{aligned} & [X_1]_{原} = 0.1011 \\ & [X_2]_{原} = 1 - (-0.1011) = 1.1011 \end{aligned} \]

根据定义,小数“0”的原码可以表示成 \(0.0...0\)\(1.0...0\).

1.2 整数原码的定义

设二进制整数 \(X = \pm x_{n - 1}x_{n - 2}...x_0\),则其原码定义为

\[ [X]_{原} = \left\{ \begin{matrix} \begin{align*} &X & 0 & \leqslant X < 2^n \\ &2^n - X & -2^n & < X \leqslant 0 \end{align*} \end{matrix} \right. \]

\(X_1 = +1011, X_2 = -1011\),求 \(X_1\)\(X_2\) 的原码。

\[ \begin{equation} \begin{split} [X_1]_{原} &= 01011\\ [X_2]_{原} &=2^4 - (-1011) \\ &=10000 + 1101 \\ &=11101 \end{split} \end{equation} \]

同样,整数“0”的原码也有两种形式,即 \(00...0\)\(10...0\).

2、反码

用反码表示带符号的二进制数时,符号位与原码相同,即用 0 表示正,用 1 表示负;数值位与符号位相关,正数反码的数值位和真值相同,而负数反码的数值位是真值的数值位按位变反。

2.1 小数反码的定义

设二进制小数 \(X = \pm 0. x_{-1}x_{-2}...x_{-m}\),则其反码定义为

\[ [X]_{反} = \left\{ \begin{matrix} \begin{align*} &X & 0 \leqslant X < 1 \\ &(2 - 2^{-m}) + X & -1 < X \leqslant 0 \end{align*} \end{matrix} \right. \]

,若 \(X_1 = +0.1011, X_2 = -0.1011\),求 \(X_1\)\(X_2\) 的反码。

\[ \begin{equation} \begin{split} [X_1]_{反} &= 0.1011\\ [X_2]_{反} &= 2 - 2^{-4} + X_2 \\ &=10.0000 - 0.0001 - 0.1011 \\ &=1.0100 \end{split} \end{equation} \]

根据定义,小数“0”的反码有两种表示形式,即 \(0.0...0\)\(1.1...1\)

2.2 整数反码的定义

设二进制整数 \(X = \pm x_{n - 1}x_{n - 2}...x_{0}\),则其反码为

\[ [X]_{反} = \left\{\begin{matrix} \begin{aligned} &X & 0 & \leqslant X < 2^n \\ &(2^{n + 1} - 1) + X & -2^n & < X \leqslant 0 \\ \end{aligned} \end{matrix}\right. \]

,若 \(X_1 = +1011, X_2 = -1011\),求 \(X_1\)\(X_2\) 的反码。

\[ \begin{equation} \begin{split} [X_1]_{反} &= 01001 \\ [X_2]_{反} &= (2^5 - 1) + X \\ &= (100000 - 1) + (-1001) \\ &= 11111 - 1001 \\ &= 10110 \end{split} \end{equation} \]

同样,整数“0”的反码也有两种形式,即 \(00...0\)\(11...1\)

反码的加减运算规则如下:

\[ \begin{equation} \begin{split} [X_1 + X_2]_{反} &= [X_1]_{反} + [X_2]_{反} \\ [X_1 - X_2]_{反} &= [X_1]_{反} + [-X_2]_{反} \end{split} \end{equation} \]

运算时,若 \(X_1 = +0.1110, X_2 = +0.0101\),则求 \(X_1 - X_2\) 可以通过反码相加实现。运算如下:

\[ [X_1 - X_2]_{反} = [X_1]_{反} + [-X_1]_{反} = 0.1110 + 1.1010 \]

\[ \begin{equation} \begin{split} 0&.111&0 \\ +\quad1&.101&0 \\ \hline 10&.100&0 \\ +\quad\ \ &&1 \\ \hline 0&.100&1 \end{split} \end {equation} \]

\([X_1 - X_2]_{反} = 0.1001\)

由于结果的符号为 0,表示是正数,故

\[X_1 - X_2 = +0.1001\]

3、补码

用补码表示带符号的二进制数时,符号位与原码、反码相同,即用 0 表示正,用 1 表示负;数值位与符号位相关,正数补码的数值位与真值相同,而负数补码的数值位是真值的数值位按位变反,并在最低位加 1。

3.1 小数补码的定义

设二进制小数 \(X = \pm 0.x_{-1}x_{-2}...x_{-m}\),则其补码定义为

\[ [X]_{补} = \left\{\begin{matrix} \begin{aligned} &X & 0 & \leqslant X < 1 \\ &2 + X & -1 & \leqslant X < 0 \\ \end{aligned} \end{matrix}\right. \]

上面的式子可以归结成一个式子:

\[ [X]_{补} = (2 + X) \; mod \; 2 \qquad -1 \leqslant X < 1 \]

,若 \(X_1 = +0.1011, X_2 = -0.1011\),则 \(X_1\)\(X_2\) 的补码为

\[ \begin{equation} \begin{split} [X_1]_{补} &= 0.1011 \\ [X_2]_{补} &= 2 + X \\ &= 10.0000 - 0.1011 \\ &= 1.0101 \end{split} \end{equation} \]

小数“0”只有一种表示形式,即 \(0.0...0\)

3.2 整数补码的定义

设二进制整数 \(X = \pm x_{n - 1}x_{n - 2}...x_0\),则其补码定义为

\[ [X]_{补} = \left\{\begin{matrix} \begin{aligned} &X & 0 & \leqslant X < 2^n \\ &2^{n + 1} + X & -2^n & \leqslant X < 0 \\ \end{aligned} \end{matrix}\right. \]

,若 \(X_1 = + 1010, X_2 = -1010\),求 \(X_1\)\(X_2\) 的补码。

\[ \begin{equation} \begin{split} [X_1]_{补} &= 01011 \\ [X_2]_{补} &= 2^5 + X \\ &= 100000 - 1010 \\ &= 10110 \end{split} \end{equation} \]

同样,整数“0”的补码也只有一种表示形式,即 \(00...0\)

补码的加减运算规则如下:

\[ \begin{equation} \begin{split} [X_1 + X_2]_{补} &= [X_1]_{补} + [X_2]_{补} \\ [X_1 - X_2]_{补} &= [X_1]_{补} + [-X_2]_{补} \end{split} \end{equation} \]

运算时,符号位和数值位一样参加运算,若符号位有进位产生。则应将进位丢掉才能得到正确结果。

例如,若 \(X_1 = -1001, X_2 = +0011\),则采用补码求 \(X_1 - X_2\) 的运算如下:

\[ [X_1 - X_2]_{补} = [X_1]_{补} + [-X_2]_{补} = 10111 + 11101 \]

\[ \begin{equation} \begin{split} 10111 \\ +\quad11101 \\ \hline 110100 \\ \end{split} \end {equation} \]

\([X_1 - X_2]_{补} = 10100\)

由于结果的符号位为 1,表示是负数,故

\[X_1 - X_2 = -1100\]


参考:

1、《数字逻辑 第四版》(华中科技大学出版社)