计算机原码、反码和补码
时间长了,在上计算机组成原理时,发现这部分的知识又遗忘了。所以还是整理以下,方便以后可以即时回顾,就不用去翻书了。
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、《数字逻辑 第四版》(华中科技大学出版社)
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!