计算机原码、反码和补码
时间长了,在上计算机组成原理时,发现这部分的知识又遗忘了。所以还是整理以下,方便以后可以即时回顾,就不用去翻书了。
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、《数字逻辑 第四版》(华中科技大学出版社)