各种数值在计算机中表示的方法称之为机器数,其特点是采用二进制,即使用数据0和1表示,小数点则隐含(不占位置)。机器数对应的实际数值称之为真值。
数的符号
根据机器数有无符号,我们可以将机器数分为:带符号数、无符号数。无符号数表示正数,在机器数中没有符号位。对于无符号数,若约定小数点的位置在机器数的最低位之后,则是纯整数;若约定小数点的位置在机器数的最高位之前,则是纯小数。对于带符号数,机器数的最高位为机器数的符号位(正负符号),其余位则表示数值。为方便运算,带符号的机器数可采用原码、反码、补码等不同的编码方法,机器数的编码方法称为码制。码制的具体类型如下:
- 原码
- 反码
- 补码
- 移码
原码
原码即一个数值的二进制表示方式,原码的首位为符号位,0为正数,1为负数。根据其是否为小数,其表现形式如下所示:
1、若X为纯整数
$$[X]_原 = \begin{cases}
X &\text 0\leq X\leq2^{n-1} – 1 \\
2^{n-1} + |X| &\text -(2^{n-1} – 1)\leq X\leq0
\end{cases}$$
2、若X为纯小数
$$[X]_原 = \begin{cases}
X &\text 0\leq X<1 \\
2^0 + |X| &\text -1<X\leq0
\end{cases}$$
示例如下:
$$[+1]_原 = 0 0000001 $$
$$[+1]_原 = 0 0000001 $$
$$[+1]_原 = 0 0000001 $$
$$[+1]_原 = 0 0000001 $$
$$[+0.5]_原 = 0 \lozenge1000000 $$
反码
正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反。若机器字节长为n,则反码定义如下:
- X为纯整数
$$[X]_反 = \begin{cases}
X &\text 0\leq X\leq2^{n-1} – 1 \\
2^n – 1 + X &\text -(2^{n-1} – 1)\leq X\leq0
\end{cases}$$
- X为纯小数
$$[X]_反 = \begin{cases}
X &\text 0\leq X<1 \\
2-2^{-(n-1)} + X &\text -1< X\leq0
\end{cases}$$
补码
正数的补码是其本身,负数的补码等于其反码 +1。若机器字节长为n,则补码定义如下:
- X为纯整数
$$[X]_补 = \begin{cases}
X &\text 0\leq X\leq2^{n-1} – 1 \\
2^n+ X &\text -2^{n-1} \leq X\leq0
\end{cases}$$
- X为纯小数
$$[X]_补 = \begin{cases}
X & \text 0\leq X<1 \\
2+ X & \text -1\leq X<0
\end{cases}$$
移码
移码(又叫增码或偏置码)通常用于表示浮点数的阶码,其表示形式与补码相似,只是其符号位用“1”表示正数,用“0”表示负数,数值部分与补码相同,即移码在补码的基础上,符号位取反。若机器字长为n,规定偏移为2n-1,则移码定义如下:
- X为纯整数
$$[X]_移 = 2^{n-1} + X \quad (-2^{n-1} \leq X < 2^{n-1})$$
- X为纯小数
$$[X]_补 = 1+ X \quad (-1 \leq X < 1)$$